suppressPackageStartupMessages({
  library(tidyverse)
  library(MOFA2)
  library(Matrix)
  library(SingleCellExperiment)
  library(scran)}
  )
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down
running command 'timedatectl' had status 1

Load pseudobulked data

indir <- "/nfs/team205/ed6/data/Fetal_immune/LMM_data/LMM_input_MYELOID_PBULK/"

matrix <- readMM(file = paste0(indir, "matrix.mtx.gz"))
coldata <- read.csv(file = paste0(indir, "metadata.csv.gz")) %>%
  column_to_rownames("X")
rowdata <- read.csv(file = paste0(indir, "gene.csv.gz")) 

## Make SingleCellExperiment obj
myeloid_sce <- SingleCellExperiment(list(logcounts = t(matrix)), colData = coldata)
rownames(myeloid_sce) <- make.unique(rowdata$GeneName) 

Preprocessing

Exclude celltypes present in just one organ

keep_ct <- data.frame(colData(myeloid_sce)) %>%
  select(organ, anno_lvl_2) %>%
  distinct() %>%
  group_by(anno_lvl_2) %>%
  summarise(n=n()) %>%
  ungroup() %>%
  filter(n > 1) %>%
  pull(anno_lvl_2)

myeloid_sce <- myeloid_sce[,myeloid_sce$anno_lvl_2 %in% keep_ct]
myeloid_sce
class: SingleCellExperiment 
dim: 33694 1183 
metadata(0):
assays(1): logcounts
rownames(33694): TSPAN6 TNMD ... RP11-107E5.4 RP11-299P2.2
rowData names(0):
colnames(1183): F21_LI_45P-F21-LI-ERY_MAC-16-3GEX F21_LI_45P-F21-LI-DC2-16-3GEX ... F66-FPI-0-SC-1-F66-GU-Mono_Mac-15-3GEX F66-FPI-0-SC-1-F66-GU-MAC-15-3GEX
colData names(6): Sample donor ... age method
reducedDimNames(0):
altExpNames(0):

Feature selection: options here

# all_obs <- read_csv("/nfs/team205/ed6/data/Fetal_immune/PAN.A01.v01.entire_data_normalised_log.wGut.batchCorrected_20210118.")

## Feature selection w scran WITHIN CELLTYPE
anno_groups <- split(colnames(myeloid_sce), myeloid_sce$anno_lvl_2)
all_hvgs <- c()
for (i in anno_groups){
  dec <- modelGeneVar(myeloid_sce[,i])
  hvgs <- getTopHVGs(dec, n = 1000)
  all_hvgs <- union(all_hvgs, hvgs)
  }

myeloid_sce <- myeloid_sce[all_hvgs,]
myeloid_sce <- myeloid_sce[which(rowSums(logcounts(myeloid_sce)) > 0),]
myeloid_sce
class: SingleCellExperiment 
dim: 4256 1183 
metadata(0):
assays(1): logcounts
rownames(4256): HBG2 HBA2 ... MIEN1 SPPL2A
rowData names(0):
colnames(1183): F21_LI_45P-F21-LI-ERY_MAC-16-3GEX F21_LI_45P-F21-LI-DC2-16-3GEX ... F66-FPI-0-SC-1-F66-GU-Mono_Mac-15-3GEX F66-FPI-0-SC-1-F66-GU-MAC-15-3GEX
colData names(6): Sample donor ... age method
reducedDimNames(0):
altExpNames(0):

Scale

assay(myeloid_sce, "scaled_logcounts") <- t(scale(t(logcounts(myeloid_sce))))

EDA with PCA

```r
library(scater)
myeloid_sce <- runPCA(myeloid_sce, scale=FALSE, ncomponents=30)

## Variance explained
percent.var <- attr(reducedDim(myeloid_sce), \percentVar\)
plot(percent.var, log=\y\, xlab=\PC\, ylab=\Variance explained (%)\)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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EJRAAwQl0ABBCTRAUAINEJRAAwQl0ABBCTRAUAINEJRAA/LfI14AABRQSURBVAQl0ABBCTRAUAINEJRAAwQl0ABBCTRAUAINEJRAAwQl0DSfuY89ODP1DNAJAk3TuXq9LbZZ64SFqceATAJNs/nDsLb/6F/beWzqOSCTQNNsRt1e2r6x2uzUg0AWgabZ9H2vvIz8S+I5IJNA02zWea28DHou8RyQSaBpNvudXtreM6w19SCQRaBpNi+uf8wjT5zT7+7Uc0AmgabpvH3MlhsfMC31FJBNoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBBghKoAGCEmiAoAQaICiBhg79/bvr9/74da2px6BpCTR05K3BP3h53p+3OD71HDQtgYaO/Gh0afvWWq+mHoRmJdDQke1bystXrk87Bs1LoKEj295XXva+LvEcNC2Bho4ccWJpO2fdZ1MPQrMSaOjIiwN+uaj4yv93YOo5aFoCDR2auuMqG65+ytzUY9C0BBqWYdaLi1KPQBMTaICgBBogKIEGCEqgAYISaICgBBogKIEGCEqgAYISaICgBBogKIEGCEqgAYISaICgBBogKIEGCEqgAYISaICgBBogKIEGCEqgAYISaICgBBogKIGGunj/6XmpR6DhCDTUwav79B3W5+C3Uo9BgxFoqN3sYSe9X5z1va0WpB6ExiLQULtL9igv2/8h8Rw0GIGG2n37kvJy2vGJ56DBCDTUbvTPy8sJJ6Udg0Yj0FC73/5La9t2/mYtqQehsQg01G7hDntMnfvILl9NPQcNRqChDt4/bfiKm57nIg7qS6ABghJogKAEGiAogQYISqABghJogKAEGrpW6+RrJsxJPQTdg0BDl3r205vst/2gW1KPQbcg0NCV5n30/NZi8YF+T6QehO5AoKEr3fIv5eXUoxLPQbcg0NCVzjuyvNz6xcRz0C0INHSlK/b78ALLJNDQlV5d+4W27fxtfpN6ELoDgYYudcl650y8Zst9WlPPQXcg0NC1/vKd7ff9Y+oh6B4EGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogYao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7+V2luof6GcLd7dtL+05u+7PnNhthcdTj1A35Zo11pn6UKAb40wdttbDpaWRztKSX2mxRjhLr1w1q1j6x5wncztLOVwHPWx022bXz9X/iZN56itT27Yn9nwv9SB1s7hmDXWmyr9SA52pK1daErPGOUtLf6XGOUuTC9e0bU9ebk5uZymHQF+5/Bl/HrNcS/2fOJm5Q0f8/v4zVjw29Rx18khLS6/RLS3vN9CZWvorNc6ZmrP+V0tv5miZ1zhn6YNfqXHOUnGXNcfd+7M+h+RXvTze6n3R4F6bXJ/D86bzwr7r9trovIWpx6iTrctvtC280EBn6oNfqWHO1GOLf6PC641zlv73V2qYs1ScdfSA3sNOKF2PktNZcrMkgKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogQYISqABghJogKAEGiAogaYx7V5os/bnJpYet161/Wp9Pnr826lnggoJNI1p941aWlqu3X65h9oe799jn+v++MPVhr+eeiiojEDTmHb/WGn7/sCvF4uXFX5RevzEKoekHQkqJdA0psWBLn5x62Jxi1GLv/To7ITzQBUEmsa0JNAf3aM4o8fxiWeBKgk0jWn3jy1YsOCVsYU7ik8Wfp16GKiOQNOYyldxFNa4rFh8qnBV6mGgOgJNY9p9+MMPP/zX+W2P3l3uhNTDQHUEmsa05DXokk8Mmltef/+fqYaB6gg0jelDgb6m8KPSMnWNg5NNA1URaBrThwJdPLjwhSuuP27VbWakGweqIdA0pg8HuvibHVbrO/JMl0HT3Qg0QFACDRCUQAMEJdAAQQk0QFACDRCUQAMEJdAAQQk0QFACDRCUQAMEJdAAQQk0QFACDRCUQAMEJdAAQQk0QFACDRCUQAMEJdAAQQk0QFACDRCUQAMEJdAAQQk0QFD/D75WXN2CaoFnAAAAAElFTkSuQmCC" />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG5wbG90UENBKG15ZWxvaWRfc2NlLCBjb2xvdXJfYnk9XFxvcmdhblxcLCBuY29tcG9uZW50cz02KVxuYGBgXG5gYGAifQ== -->

```r
```r

plotPCA(myeloid_sce, colour_by=\organ\, ncomponents=6)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64," />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGxvdFBDQShteWVsb2lkX3NjZSwgY29sb3VyX2J5PVxcYW5ub19sdmxfMlxcLCBuY29tcG9uZW50cz02KVxuYGBgXG5gYGAifQ== -->

```r
```r
plotPCA(myeloid_sce, colour_by=\anno_lvl_2\, ncomponents=6)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64," />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucGxvdFBDQShteWVsb2lkX3NjZSwgY29sb3VyX2J5PVwiYW5ub19sdmxfMlwiLCB0ZXh0X2J5PVwiYW5ub19sdmxfMlwiKVxuYGBgIn0= -->

```r
plotPCA(myeloid_sce, colour_by="anno_lvl_2", text_by="anno_lvl_2")

plotPCA(myeloid_sce, colour_by="organ", text_by="anno_lvl_2")

Minimize obvious technical effects (3GEX/5GEX) using linear regression (following procedure from OSCA)

library(batchelor)
myeloid_sce_3gex <- myeloid_sce[,myeloid_sce$method=="3GEX"]
myeloid_sce_5gex <- myeloid_sce[,myeloid_sce$method=="5GEX"]

set.seed(10001)
residuals <- regressBatches(myeloid_sce_3gex, myeloid_sce_5gex, d=30,
    assay.type = "logcounts",
    correct.all=TRUE,
    BSPARAM=BiocSingular::RandomParam())

assay(myeloid_sce, "scaled_logcounts") <- as.matrix(assay(residuals[,colnames(myeloid_sce)], "corrected"))

Model 1 - Normal MOFA / organs as views

Make MOFA object. Use - Organ as view - Celltypes as groups

## Split into one matrix x organ
org_ixs <- split(colnames(myeloid_sce), myeloid_sce$organ)
data <- lapply(org_ixs, function(i) assay(myeloid_sce[,i], "scaled_logcounts"))
data <- lapply(data, as.matrix)

## Collapse measurements from the same donor/library prep
new_sample <- paste(myeloid_sce$donor, myeloid_sce$method,myeloid_sce$anno_lvl_2, sep="-")
newsample_ixs <- split(new_sample, myeloid_sce$organ)
for (o in names(data)){
  colnames(data[[o]]) <- newsample_ixs[[o]]
}

## Fill missing values
sample_names_unique <- unique(new_sample)
for (o in names(data)){
  for (s in sample_names_unique){
    if (!s %in% colnames(data[[o]])) {
      m <- matrix(NA, nrow=nrow(data[[o]]))
      colnames(m) <- s
      data[[o]] <- cbind(data[[o]], m)
    }
  }
  data[[o]] <- data[[o]][,sample_names_unique]
}

## Vector for group assignment
groups <- sapply(strsplit(sample_names_unique, "-"), function(x) x[3])

myeloid_mofa <- create_mofa_from_matrix(data, groups = groups)
There are duplicated features names across different views. We will add the suffix *_view* only for those features 
            Example: if you have both TP53 in mRNA and mutation data it will be renamed to TP53_mRNA, TP53_mutation
myeloid_mofa
Untrained MOFA model with the following characteristics: 
 Number of views: 9 
 Views names: BM GU KI LI MLN SK SP TH YS 
 Number of features (per view): 4256 4256 4256 4256 4256 4256 4256 4256 4256 
 Number of groups: 19 
 Groups names: Basophil CD14_monocyte CLP DC_progen DC1 DC2 DC3 Eosinophil_MOP ERY_MAC GMP HSC_MPP MAC MAST_cell Mono_Mac MPP_MYE myelocyte neutrophil promonocyte Promyelocyte 
 Number of samples (per group): 20 25 21 11 22 29 24 19 23 17 19 22 20 25 18 8 21 23 19 
 

Regular MOFA

myeloid_mofa
Untrained MOFA model with the following characteristics: 
 Number of views: 9 
 Views names: BM GU KI LI MLN SK SP TH YS 
 Number of features (per view): 4256 4256 4256 4256 4256 4256 4256 4256 4256 
 Number of groups: 19 
 Groups names: Basophil CD14_monocyte CLP DC_progen DC1 DC2 DC3 Eosinophil_MOP ERY_MAC GMP HSC_MPP MAC MAST_cell Mono_Mac MPP_MYE myelocyte neutrophil promonocyte Promyelocyte 
 Number of samples (per group): 20 25 21 11 22 29 24 19 23 17 19 22 20 25 18 8 21 23 19 
 

Prepare 4 training

data_opts <- get_default_data_options(myeloid_mofa)
data_opts$center_groups <- FALSE

model_opts <- get_default_model_options(myeloid_mofa)
model_opts$num_factors <- 20

train_opts <- get_default_training_options(myeloid_mofa)
train_opts$seed <- 2020
train_opts$convergence_mode <- "fast" # use "fast" for faster training
train_opts$stochastic <- FALSE

mefisto_opts <- get_default_mefisto_options(myeloid_mofa)
mefisto_opts$warping <- FALSE
# mefisto_opts$sparseGP <- TRUE

myeloid_mofa <- prepare_mofa(
  object = myeloid_mofa,
  data_options = data_opts,
  model_options = model_opts,
  training_options = train_opts,
  mefisto_options = mefisto_opts
) 
Some group(s) have less than 10 samples, MOFA will have little power to learn meaningful factors for these group(s)...
# Multi-group mode requested.

This is an advanced option, if this is the first time that you are running MOFA, we suggest that you try do some exploration first without specifying groups. Two important remarks:

 - The aim of the multi-group framework is to identify the sources of variability *within* the groups. If your aim is to find a factor that 'separates' the groups, you DO NOT want to use the multi-group framework. Please see the FAQ in (https://biofam.github.io/MOFA2)

 - It is important to account for the group effect before selecting highly variable features (HVFs). We suggest that either you calculate HVFs per group and then take the union, or regress out the group effect before HVF selection
Checking data options...
Checking training options...
Checking model options...

Train

outfile <- "/nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model.hdf5"
myeloid_mofa_trained <- run_mofa(myeloid_mofa, outfile = outfile)
Connecting to the mofapy2 python package using reticulate (use_basilisk = FALSE)... 
    Please make sure to manually specify the right python binary when loading R with reticulate::use_python(..., force=TRUE) or the right conda environment with reticulate::use_condaenv(..., force=TRUE)
    If you prefer to let us automatically install a conda environment with 'mofapy2' installed using the 'basilisk' package, please use the argument 'use_basilisk = TRUE'

        #########################################################
        ###           __  __  ____  ______                    ### 
        ###          |  \/  |/ __ \|  ____/\    _             ### 
        ###          | \  / | |  | | |__ /  \ _| |_           ### 
        ###          | |\/| | |  | |  __/ /\ \_   _|          ###
        ###          | |  | | |__| | | / ____ \|_|            ###
        ###          |_|  |_|\____/|_|/_/    \_\              ###
        ###                                                   ### 
        ######################################################### 
       
 
        
Successfully loaded view='BM' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='BM' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='BM' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='BM' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='BM' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='BM' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='BM' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='BM' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='BM' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='BM' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='BM' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='BM' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='BM' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='BM' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='BM' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='BM' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='BM' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='BM' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='BM' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='GU' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='GU' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='GU' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='GU' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='GU' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='GU' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='GU' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='GU' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='GU' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='GU' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='GU' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='GU' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='GU' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='GU' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='GU' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='GU' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='GU' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='GU' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='GU' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='KI' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='KI' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='KI' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='KI' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='KI' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='KI' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='KI' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='KI' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='KI' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='KI' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='KI' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='KI' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='KI' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='KI' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='KI' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='KI' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='KI' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='KI' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='KI' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='LI' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='LI' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='LI' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='LI' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='LI' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='LI' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='LI' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='LI' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='LI' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='LI' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='LI' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='LI' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='LI' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='LI' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='LI' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='LI' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='LI' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='LI' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='LI' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='MLN' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='MLN' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='MLN' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='MLN' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='MLN' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='MLN' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='MLN' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='MLN' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='MLN' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='MLN' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='MLN' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='MLN' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='MLN' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='MLN' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='MLN' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='MLN' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='MLN' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='MLN' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='MLN' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='SK' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='SK' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='SK' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='SK' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='SK' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='SK' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='SK' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='SK' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='SK' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='SK' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='SK' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='SK' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='SK' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='SK' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='SK' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='SK' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='SK' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='SK' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='SK' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='SP' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='SP' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='SP' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='SP' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='SP' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='SP' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='SP' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='SP' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='SP' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='SP' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='SP' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='SP' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='SP' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='SP' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='SP' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='SP' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='SP' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='SP' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='SP' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='TH' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='TH' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='TH' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='TH' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='TH' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='TH' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='TH' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='TH' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='TH' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='TH' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='TH' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='TH' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='TH' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='TH' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='TH' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='TH' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='TH' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='TH' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='TH' group='Promyelocyte' with N=19 samples and D=4256 features...
Successfully loaded view='YS' group='Basophil' with N=20 samples and D=4256 features...
Successfully loaded view='YS' group='CD14_monocyte' with N=25 samples and D=4256 features...
Successfully loaded view='YS' group='CLP' with N=21 samples and D=4256 features...
Successfully loaded view='YS' group='DC_progen' with N=11 samples and D=4256 features...
Successfully loaded view='YS' group='DC1' with N=22 samples and D=4256 features...
Successfully loaded view='YS' group='DC2' with N=29 samples and D=4256 features...
Successfully loaded view='YS' group='DC3' with N=24 samples and D=4256 features...
Successfully loaded view='YS' group='Eosinophil_MOP' with N=19 samples and D=4256 features...
Successfully loaded view='YS' group='ERY_MAC' with N=23 samples and D=4256 features...
Successfully loaded view='YS' group='GMP' with N=17 samples and D=4256 features...
Successfully loaded view='YS' group='HSC_MPP' with N=19 samples and D=4256 features...
Successfully loaded view='YS' group='MAC' with N=22 samples and D=4256 features...
Successfully loaded view='YS' group='MAST_cell' with N=20 samples and D=4256 features...
Successfully loaded view='YS' group='Mono_Mac' with N=25 samples and D=4256 features...
Successfully loaded view='YS' group='MPP_MYE' with N=18 samples and D=4256 features...
Successfully loaded view='YS' group='myelocyte' with N=8 samples and D=4256 features...
Successfully loaded view='YS' group='neutrophil' with N=21 samples and D=4256 features...
Successfully loaded view='YS' group='promonocyte' with N=23 samples and D=4256 features...
Successfully loaded view='YS' group='Promyelocyte' with N=19 samples and D=4256 features...


Model options:
- Automatic Relevance Determination prior on the factors: True
- Automatic Relevance Determination prior on the weights: True
- Spike-and-slab prior on the factors: False
- Spike-and-slab prior on the weights: True
Likelihoods:
- View 0 (BM): gaussian
- View 1 (GU): gaussian
- View 2 (KI): gaussian
- View 3 (LI): gaussian
- View 4 (MLN): gaussian
- View 5 (SK): gaussian
- View 6 (SP): gaussian
- View 7 (TH): gaussian
- View 8 (YS): gaussian



Warning: some group(s) have less than 15 samples, MOFA won't be able to learn meaningful factors for these group(s)...



######################################
## Training the model with seed 2020 ##
######################################


ELBO before training: -49128692.21 

Iteration 1: time=12.71, ELBO=-7398394.56, deltaELBO=41730297.651 (84.94078668%), Factors=20
Iteration 2: time=12.54, Factors=20
Iteration 3: time=12.53, Factors=20
Iteration 4: time=12.54, Factors=20
Iteration 5: time=12.52, Factors=20
Iteration 6: time=12.74, ELBO=-5625656.57, deltaELBO=1772737.990 (3.60835575%), Factors=20
Iteration 7: time=12.60, Factors=20
Iteration 8: time=12.53, Factors=20
Iteration 9: time=12.55, Factors=20
Iteration 10: time=12.42, Factors=20
Iteration 11: time=12.61, ELBO=-5397124.31, deltaELBO=228532.261 (0.46517066%), Factors=20
Iteration 12: time=12.46, Factors=20
Iteration 13: time=12.95, Factors=20
Iteration 14: time=12.55, Factors=20
Iteration 15: time=12.49, Factors=20
Iteration 16: time=12.75, ELBO=-5315593.98, deltaELBO=81530.327 (0.16595257%), Factors=20
Iteration 17: time=12.48, Factors=20
Iteration 18: time=12.57, Factors=20
Iteration 19: time=12.62, Factors=20
Iteration 20: time=12.66, Factors=20
Iteration 21: time=12.65, ELBO=-5279402.23, deltaELBO=36191.751 (0.07366724%), Factors=20
Iteration 22: time=12.62, Factors=20
Iteration 23: time=12.52, Factors=20
Iteration 24: time=12.50, Factors=20
Iteration 25: time=12.41, Factors=20
Iteration 26: time=12.66, ELBO=-5258330.27, deltaELBO=21071.959 (0.04289135%), Factors=20
Iteration 27: time=12.40, Factors=20
Iteration 28: time=12.43, Factors=20
Iteration 29: time=12.36, Factors=20
Iteration 30: time=12.26, Factors=20
Iteration 31: time=12.77, ELBO=-5243781.65, deltaELBO=14548.617 (0.02961328%), Factors=20
Iteration 32: time=12.56, Factors=20
Iteration 33: time=12.42, Factors=20
Iteration 34: time=12.42, Factors=20
Iteration 35: time=12.47, Factors=20
Iteration 36: time=12.59, ELBO=-5232879.82, deltaELBO=10901.832 (0.02219036%), Factors=20
Iteration 37: time=12.46, Factors=20
Iteration 38: time=12.43, Factors=20
Iteration 39: time=12.47, Factors=20
Iteration 40: time=12.35, Factors=20
Iteration 41: time=12.48, ELBO=-5224408.87, deltaELBO=8470.953 (0.01724238%), Factors=20
Iteration 42: time=12.26, Factors=20
Iteration 43: time=12.27, Factors=20
Iteration 44: time=12.14, Factors=20
Iteration 45: time=12.30, Factors=20
Iteration 46: time=12.42, ELBO=-5217440.75, deltaELBO=6968.123 (0.01418341%), Factors=20
Iteration 47: time=12.25, Factors=20
Iteration 48: time=12.20, Factors=20
Iteration 49: time=12.20, Factors=20
Iteration 50: time=12.19, Factors=20
Iteration 51: time=12.24, ELBO=-4951118.76, deltaELBO=266321.982 (0.54209052%), Factors=20
Iteration 52: time=12.23, Factors=20
Iteration 53: time=12.11, Factors=20
Iteration 54: time=12.14, Factors=20
Iteration 55: time=12.21, Factors=20
Iteration 56: time=12.40, ELBO=-4939172.08, deltaELBO=11946.680 (0.02431711%), Factors=20
Iteration 57: time=12.31, Factors=20
Iteration 58: time=12.43, Factors=20
Iteration 59: time=12.25, Factors=20
Iteration 60: time=12.22, Factors=20
Iteration 61: time=12.33, ELBO=-4933010.57, deltaELBO=6161.510 (0.01254157%), Factors=20
Iteration 62: time=12.29, Factors=20
Iteration 63: time=12.15, Factors=20
Iteration 64: time=12.28, Factors=20
Iteration 65: time=12.29, Factors=20
Iteration 66: time=12.41, ELBO=-4928410.81, deltaELBO=4599.764 (0.00936268%), Factors=20
Iteration 67: time=12.30, Factors=20
Iteration 68: time=12.33, Factors=20
Iteration 69: time=12.24, Factors=20
Iteration 70: time=12.28, Factors=20
Iteration 71: time=12.40, ELBO=-4924838.86, deltaELBO=3571.949 (0.00727060%), Factors=20
Iteration 72: time=12.30, Factors=20
Iteration 73: time=12.17, Factors=20
Iteration 74: time=12.26, Factors=20
Iteration 75: time=12.23, Factors=20
Iteration 76: time=12.43, ELBO=-4921827.88, deltaELBO=3010.982 (0.00612876%), Factors=20
Iteration 77: time=12.32, Factors=20
Iteration 78: time=12.30, Factors=20
Iteration 79: time=12.20, Factors=20
Iteration 80: time=12.21, Factors=20
Iteration 81: time=12.30, ELBO=-4919173.53, deltaELBO=2654.353 (0.00540286%), Factors=20
Iteration 82: time=12.21, Factors=20
Iteration 83: time=12.08, Factors=20
Iteration 84: time=12.13, Factors=20
Iteration 85: time=12.13, Factors=20
Iteration 86: time=12.52, ELBO=-4916845.89, deltaELBO=2327.638 (0.00473784%), Factors=20
Iteration 87: time=12.28, Factors=20
Iteration 88: time=12.15, Factors=20
Iteration 89: time=12.16, Factors=20
Iteration 90: time=12.11, Factors=20
Iteration 91: time=12.31, ELBO=-4914830.53, deltaELBO=2015.361 (0.00410221%), Factors=20
Iteration 92: time=12.18, Factors=20
Iteration 93: time=12.17, Factors=20
Iteration 94: time=12.18, Factors=20
Iteration 95: time=12.25, Factors=20
Iteration 96: time=12.58, ELBO=-4912938.39, deltaELBO=1892.135 (0.00385138%), Factors=20
Iteration 97: time=12.30, Factors=20
Iteration 98: time=12.18, Factors=20
Iteration 99: time=12.13, Factors=20
Iteration 100: time=12.09, Factors=20
Iteration 101: time=12.37, ELBO=-4911181.01, deltaELBO=1757.384 (0.00357710%), Factors=20
Iteration 102: time=12.27, Factors=20
Iteration 103: time=12.19, Factors=20
Iteration 104: time=12.24, Factors=20
Iteration 105: time=12.21, Factors=20
Iteration 106: time=12.33, ELBO=-4909534.18, deltaELBO=1646.828 (0.00335207%), Factors=20
Iteration 107: time=12.16, Factors=20
Iteration 108: time=12.18, Factors=20
Iteration 109: time=12.21, Factors=20
Iteration 110: time=12.24, Factors=20
Iteration 111: time=12.38, ELBO=-4908064.86, deltaELBO=1469.324 (0.00299076%), Factors=20
Iteration 112: time=12.20, Factors=20
Iteration 113: time=12.19, Factors=20
Iteration 114: time=12.29, Factors=20
Iteration 115: time=12.22, Factors=20
Iteration 116: time=12.41, ELBO=-4906707.71, deltaELBO=1357.145 (0.00276243%), Factors=20
Iteration 117: time=12.14, Factors=20
Iteration 118: time=12.18, Factors=20
Iteration 119: time=12.25, Factors=20
Iteration 120: time=12.20, Factors=20
Iteration 121: time=12.28, ELBO=-4905419.49, deltaELBO=1288.226 (0.00262215%), Factors=20
Iteration 122: time=12.18, Factors=20
Iteration 123: time=12.08, Factors=20
Iteration 124: time=12.14, Factors=20
Iteration 125: time=12.07, Factors=20
Iteration 126: time=12.29, ELBO=-4904242.20, deltaELBO=1177.290 (0.00239634%), Factors=20
Iteration 127: time=12.25, Factors=20
Iteration 128: time=12.30, Factors=20
Iteration 129: time=12.26, Factors=20
Iteration 130: time=12.38, Factors=20
Iteration 131: time=12.50, ELBO=-4903193.11, deltaELBO=1049.086 (0.00213538%), Factors=20
Iteration 132: time=12.30, Factors=20
Iteration 133: time=12.34, Factors=20
Iteration 134: time=12.24, Factors=20
Iteration 135: time=12.23, Factors=20
Iteration 136: time=12.43, ELBO=-4902229.95, deltaELBO=963.163 (0.00196049%), Factors=20
Iteration 137: time=12.31, Factors=20
Iteration 138: time=12.35, Factors=20
Iteration 139: time=12.46, Factors=20
Iteration 140: time=12.37, Factors=20
Iteration 141: time=12.40, ELBO=-4901220.79, deltaELBO=1009.155 (0.00205411%), Factors=20
Iteration 142: time=12.24, Factors=20
Iteration 143: time=12.14, Factors=20
Iteration 144: time=12.15, Factors=20
Iteration 145: time=12.10, Factors=20
Iteration 146: time=12.24, ELBO=-4900212.98, deltaELBO=1007.813 (0.00205137%), Factors=20
Iteration 147: time=12.10, Factors=20
Iteration 148: time=12.10, Factors=20
Iteration 149: time=12.14, Factors=20
Iteration 150: time=12.25, Factors=20
Iteration 151: time=12.38, ELBO=-4899155.53, deltaELBO=1057.451 (0.00215241%), Factors=20
Iteration 152: time=12.23, Factors=20
Iteration 153: time=12.21, Factors=20
Iteration 154: time=12.22, Factors=20
Iteration 155: time=12.17, Factors=20
Iteration 156: time=12.43, ELBO=-4898148.54, deltaELBO=1006.985 (0.00204969%), Factors=20
Iteration 157: time=12.29, Factors=20
Iteration 158: time=12.11, Factors=20
Iteration 159: time=12.11, Factors=20
Iteration 160: time=12.16, Factors=20
Iteration 161: time=12.19, ELBO=-4897173.58, deltaELBO=974.963 (0.00198451%), Factors=20
Iteration 162: time=12.13, Factors=20
Iteration 163: time=12.13, Factors=20
Iteration 164: time=12.10, Factors=20
Iteration 165: time=12.27, Factors=20
Iteration 166: time=12.42, ELBO=-4896287.19, deltaELBO=886.392 (0.00180423%), Factors=20
Iteration 167: time=12.35, Factors=20
Iteration 168: time=12.16, Factors=20
Iteration 169: time=12.01, Factors=20
Iteration 170: time=12.18, Factors=20
Iteration 171: time=12.25, ELBO=-4895447.11, deltaELBO=840.082 (0.00170996%), Factors=20
Iteration 172: time=12.11, Factors=20
Iteration 173: time=12.13, Factors=20
Iteration 174: time=12.09, Factors=20
Iteration 175: time=12.08, Factors=20
Iteration 176: time=12.24, ELBO=-4894679.35, deltaELBO=767.761 (0.00156275%), Factors=20
Iteration 177: time=12.14, Factors=20
Iteration 178: time=12.16, Factors=20
Iteration 179: time=12.33, Factors=20
Iteration 180: time=12.02, Factors=20
Iteration 181: time=12.30, ELBO=-4893960.13, deltaELBO=719.220 (0.00146395%), Factors=20
Iteration 182: time=12.22, Factors=20
Iteration 183: time=12.17, Factors=20
Iteration 184: time=12.09, Factors=20
Iteration 185: time=12.19, Factors=20
Iteration 186: time=12.47, ELBO=-4893263.54, deltaELBO=696.589 (0.00141789%), Factors=20
Iteration 187: time=12.34, Factors=20
Iteration 188: time=12.18, Factors=20
Iteration 189: time=12.22, Factors=20
Iteration 190: time=12.15, Factors=20
Iteration 191: time=12.31, ELBO=-4892533.30, deltaELBO=730.238 (0.00148638%), Factors=20
Iteration 192: time=12.14, Factors=20
Iteration 193: time=12.13, Factors=20
Iteration 194: time=12.22, Factors=20
Iteration 195: time=12.12, Factors=20
Iteration 196: time=12.25, ELBO=-4891840.02, deltaELBO=693.279 (0.00141115%), Factors=20
Iteration 197: time=12.04, Factors=20
Iteration 198: time=12.07, Factors=20
Iteration 199: time=12.22, Factors=20
Iteration 200: time=12.19, Factors=20
Iteration 201: time=12.39, ELBO=-4891160.72, deltaELBO=679.295 (0.00138269%), Factors=20
Iteration 202: time=12.22, Factors=20
Iteration 203: time=12.23, Factors=20
Iteration 204: time=12.31, Factors=20
Iteration 205: time=12.23, Factors=20
Iteration 206: time=12.25, ELBO=-4890482.42, deltaELBO=678.306 (0.00138067%), Factors=20
Iteration 207: time=12.05, Factors=20
Iteration 208: time=12.08, Factors=20
Iteration 209: time=12.08, Factors=20
Iteration 210: time=12.12, Factors=20
Iteration 211: time=12.27, ELBO=-4889839.98, deltaELBO=642.437 (0.00130766%), Factors=20
Iteration 212: time=12.08, Factors=20
Iteration 213: time=12.11, Factors=20
Iteration 214: time=12.22, Factors=20
Iteration 215: time=12.19, Factors=20
Iteration 216: time=12.31, ELBO=-4889264.81, deltaELBO=575.175 (0.00117075%), Factors=20
Iteration 217: time=12.37, Factors=20
Iteration 218: time=12.27, Factors=20
Iteration 219: time=12.44, Factors=20
Iteration 220: time=12.26, Factors=20
Iteration 221: time=12.21, ELBO=-4888712.30, deltaELBO=552.507 (0.00112461%), Factors=20
Iteration 222: time=12.09, Factors=20
Iteration 223: time=12.09, Factors=20
Iteration 224: time=12.20, Factors=20
Iteration 225: time=12.03, Factors=20
Iteration 226: time=12.38, ELBO=-4888168.74, deltaELBO=543.562 (0.00110640%), Factors=20
Iteration 227: time=12.46, Factors=20
Iteration 228: time=12.16, Factors=20
Iteration 229: time=11.97, Factors=20
Iteration 230: time=12.02, Factors=20
Iteration 231: time=12.25, ELBO=-4887608.56, deltaELBO=560.180 (0.00114023%), Factors=20
Iteration 232: time=12.24, Factors=20
Iteration 233: time=12.15, Factors=20
Iteration 234: time=12.22, Factors=20
Iteration 235: time=12.23, Factors=20
Iteration 236: time=12.25, ELBO=-4887099.94, deltaELBO=508.618 (0.00103528%), Factors=20
Iteration 237: time=12.04, Factors=20
Iteration 238: time=12.08, Factors=20
Iteration 239: time=12.13, Factors=20
Iteration 240: time=12.12, Factors=20
Iteration 241: time=12.35, ELBO=-4886607.44, deltaELBO=492.495 (0.00100246%), Factors=20
Iteration 242: time=12.10, Factors=20
Iteration 243: time=12.12, Factors=20
Iteration 244: time=12.19, Factors=20
Iteration 245: time=12.15, Factors=20
Iteration 246: time=12.32, ELBO=-4886100.16, deltaELBO=507.281 (0.00103256%), Factors=20
Iteration 247: time=12.05, Factors=20
Iteration 248: time=12.15, Factors=20
Iteration 249: time=12.12, Factors=20
Iteration 250: time=12.11, Factors=20
Iteration 251: time=12.29, ELBO=-4885624.71, deltaELBO=475.453 (0.00096777%), Factors=20
Iteration 252: time=12.23, Factors=20
Iteration 253: time=12.15, Factors=20
Iteration 254: time=12.08, Factors=20
Iteration 255: time=12.10, Factors=20
Iteration 256: time=12.35, ELBO=-4885157.21, deltaELBO=467.503 (0.00095159%), Factors=20
Iteration 257: time=12.19, Factors=20
Iteration 258: time=12.12, Factors=20
Iteration 259: time=12.26, Factors=20
Iteration 260: time=12.35, Factors=20
Iteration 261: time=12.45, ELBO=-4884687.54, deltaELBO=469.669 (0.00095600%), Factors=20
Iteration 262: time=12.32, Factors=20
Iteration 263: time=12.20, Factors=20
Iteration 264: time=12.24, Factors=20
Iteration 265: time=12.08, Factors=20
Iteration 266: time=12.31, ELBO=-4884247.82, deltaELBO=439.723 (0.00089504%), Factors=20
Iteration 267: time=12.26, Factors=20
Iteration 268: time=12.32, Factors=20
Iteration 269: time=12.27, Factors=20
Iteration 270: time=12.20, Factors=20
Iteration 271: time=12.20, ELBO=-4883830.29, deltaELBO=417.522 (0.00084985%), Factors=20
Iteration 272: time=12.18, Factors=20
Iteration 273: time=12.32, Factors=20
Iteration 274: time=12.28, Factors=20
Iteration 275: time=12.30, Factors=20
Iteration 276: time=12.50, ELBO=-4883377.28, deltaELBO=453.012 (0.00092209%), Factors=20
Iteration 277: time=12.31, Factors=20
Iteration 278: time=12.45, Factors=20
Iteration 279: time=12.60, Factors=20
Iteration 280: time=12.79, Factors=20
Iteration 281: time=13.02, ELBO=-4882939.37, deltaELBO=437.913 (0.00089136%), Factors=20
Iteration 282: time=13.04, Factors=20
Iteration 283: time=13.09, Factors=20
Iteration 284: time=13.11, Factors=20
Iteration 285: time=13.17, Factors=20
Iteration 286: time=13.30, ELBO=-4882497.61, deltaELBO=441.755 (0.00089918%), Factors=20
Iteration 287: time=13.23, Factors=20
Iteration 288: time=13.39, Factors=20
Iteration 289: time=13.33, Factors=20
Iteration 290: time=13.40, Factors=20
Iteration 291: time=13.51, ELBO=-4882069.87, deltaELBO=427.741 (0.00087065%), Factors=20
Iteration 292: time=13.44, Factors=20
Iteration 293: time=13.23, Factors=20
Iteration 294: time=13.29, Factors=20
Iteration 295: time=13.16, Factors=20
Iteration 296: time=13.35, ELBO=-4881648.42, deltaELBO=421.455 (0.00085786%), Factors=20
Iteration 297: time=12.93, Factors=20
Iteration 298: time=12.70, Factors=20
Iteration 299: time=12.51, Factors=20
Iteration 300: time=12.25, Factors=20
Iteration 301: time=12.30, ELBO=-4881265.52, deltaELBO=382.898 (0.00077938%), Factors=20
Iteration 302: time=12.11, Factors=20
Iteration 303: time=12.21, Factors=20
Iteration 304: time=12.07, Factors=20
Iteration 305: time=12.05, Factors=20
Iteration 306: time=12.43, ELBO=-4880863.78, deltaELBO=401.742 (0.00081773%), Factors=20
Iteration 307: time=12.16, Factors=20
Iteration 308: time=12.08, Factors=20
Iteration 309: time=12.14, Factors=20
Iteration 310: time=12.26, Factors=20
Iteration 311: time=12.26, ELBO=-4880429.05, deltaELBO=434.728 (0.00088488%), Factors=20
Iteration 312: time=12.14, Factors=20
Iteration 313: time=12.19, Factors=20
Iteration 314: time=12.02, Factors=20
Iteration 315: time=12.12, Factors=20
Iteration 316: time=12.44, ELBO=-4880053.54, deltaELBO=375.508 (0.00076434%), Factors=20
Iteration 317: time=12.15, Factors=20
Iteration 318: time=12.16, Factors=20
Iteration 319: time=12.02, Factors=20
Iteration 320: time=12.13, Factors=20
Iteration 321: time=12.34, ELBO=-4879672.02, deltaELBO=381.521 (0.00077657%), Factors=20
Iteration 322: time=12.08, Factors=20
Iteration 323: time=12.02, Factors=20
Iteration 324: time=12.02, Factors=20
Iteration 325: time=12.08, Factors=20
Iteration 326: time=12.18, ELBO=-4879292.75, deltaELBO=379.267 (0.00077199%), Factors=20
Iteration 327: time=12.20, Factors=20
Iteration 328: time=12.30, Factors=20
Iteration 329: time=12.23, Factors=20
Iteration 330: time=12.22, Factors=20
Iteration 331: time=12.49, ELBO=-4878910.94, deltaELBO=381.814 (0.00077717%), Factors=20
Iteration 332: time=12.31, Factors=20
Iteration 333: time=12.34, Factors=20
Iteration 334: time=12.33, Factors=20
Iteration 335: time=12.36, Factors=20
Iteration 336: time=12.62, ELBO=-4878487.36, deltaELBO=423.584 (0.00086219%), Factors=20
Iteration 337: time=12.38, Factors=20
Iteration 338: time=12.37, Factors=20
Iteration 339: time=12.29, Factors=20
Iteration 340: time=12.35, Factors=20
Iteration 341: time=12.54, ELBO=-4878027.37, deltaELBO=459.989 (0.00093629%), Factors=20
Iteration 342: time=12.38, Factors=20
Iteration 343: time=12.34, Factors=20
Iteration 344: time=12.17, Factors=20
Iteration 345: time=12.21, Factors=20
Iteration 346: time=12.18, ELBO=-4877471.03, deltaELBO=556.337 (0.00113241%), Factors=20
Iteration 347: time=12.00, Factors=20
Iteration 348: time=12.07, Factors=20
Iteration 349: time=12.04, Factors=20
Iteration 350: time=12.17, Factors=20
Iteration 351: time=12.26, ELBO=-4876807.53, deltaELBO=663.503 (0.00135054%), Factors=20
Iteration 352: time=12.06, Factors=20
Iteration 353: time=12.10, Factors=20
Iteration 354: time=12.09, Factors=20
Iteration 355: time=12.06, Factors=20
Iteration 356: time=12.17, ELBO=-4876210.21, deltaELBO=597.321 (0.00121583%), Factors=20
Iteration 357: time=12.00, Factors=20
Iteration 358: time=12.07, Factors=20
Iteration 359: time=12.08, Factors=20
Iteration 360: time=12.21, Factors=20
Iteration 361: time=12.50, ELBO=-4875757.07, deltaELBO=453.140 (0.00092235%), Factors=20
Iteration 362: time=12.22, Factors=20
Iteration 363: time=12.27, Factors=20
Iteration 364: time=12.22, Factors=20
Iteration 365: time=12.26, Factors=20
Iteration 366: time=12.39, ELBO=-4875425.26, deltaELBO=331.803 (0.00067538%), Factors=20
Iteration 367: time=12.25, Factors=20
Iteration 368: time=12.16, Factors=20
Iteration 369: time=12.06, Factors=20
Iteration 370: time=12.12, Factors=20
Iteration 371: time=12.27, ELBO=-4875077.96, deltaELBO=347.304 (0.00070693%), Factors=20
Iteration 372: time=12.11, Factors=20
Iteration 373: time=12.31, Factors=20
Iteration 374: time=12.04, Factors=20
Iteration 375: time=12.11, Factors=20
Iteration 376: time=12.33, ELBO=-4874754.22, deltaELBO=323.745 (0.00065897%), Factors=20
Iteration 377: time=12.12, Factors=20
Iteration 378: time=12.28, Factors=20
Iteration 379: time=12.14, Factors=20
Iteration 380: time=12.17, Factors=20
Iteration 381: time=12.28, ELBO=-4874463.06, deltaELBO=291.154 (0.00059263%), Factors=20
Iteration 382: time=12.13, Factors=20
Iteration 383: time=12.13, Factors=20
Iteration 384: time=11.98, Factors=20
Iteration 385: time=12.15, Factors=20
Iteration 386: time=12.43, ELBO=-4874148.66, deltaELBO=314.404 (0.00063996%), Factors=20
Iteration 387: time=12.31, Factors=20
Iteration 388: time=12.10, Factors=20
Iteration 389: time=12.11, Factors=20
Iteration 390: time=12.27, Factors=20
Iteration 391: time=12.26, ELBO=-4873848.34, deltaELBO=300.315 (0.00061128%), Factors=20
Iteration 392: time=12.18, Factors=20
Iteration 393: time=12.08, Factors=20
Iteration 394: time=12.20, Factors=20
Iteration 395: time=12.25, Factors=20
Iteration 396: time=12.44, ELBO=-4873550.03, deltaELBO=298.316 (0.00060721%), Factors=20
Iteration 397: time=12.32, Factors=20
Iteration 398: time=12.34, Factors=20
Iteration 399: time=12.17, Factors=20
Iteration 400: time=12.28, Factors=20
Iteration 401: time=12.48, ELBO=-4873281.08, deltaELBO=268.947 (0.00054743%), Factors=20
Iteration 402: time=12.32, Factors=20
Iteration 403: time=12.22, Factors=20
Iteration 404: time=12.21, Factors=20
Iteration 405: time=12.35, Factors=20
Iteration 406: time=12.49, ELBO=-4872989.71, deltaELBO=291.372 (0.00059308%), Factors=20
Iteration 407: time=12.39, Factors=20
Iteration 408: time=12.45, Factors=20
Iteration 409: time=12.34, Factors=20
Iteration 410: time=12.33, Factors=20
Iteration 411: time=12.41, ELBO=-4872715.34, deltaELBO=274.365 (0.00055846%), Factors=20
Iteration 412: time=12.48, Factors=20
Iteration 413: time=12.39, Factors=20
Iteration 414: time=12.58, Factors=20
Iteration 415: time=12.89, Factors=20
Iteration 416: time=13.38, ELBO=-4872424.00, deltaELBO=291.344 (0.00059302%), Factors=20
Iteration 417: time=13.59, Factors=20
Iteration 418: time=14.21, Factors=20
Iteration 419: time=15.05, Factors=20
Iteration 420: time=15.98, Factors=20
Iteration 421: time=16.91, ELBO=-4872138.17, deltaELBO=285.829 (0.00058180%), Factors=20
Iteration 422: time=17.82, Factors=20
Iteration 423: time=18.51, Factors=20
Iteration 424: time=19.13, Factors=20
Iteration 425: time=19.58, Factors=20
Iteration 426: time=20.06, ELBO=-4871871.76, deltaELBO=266.407 (0.00054226%), Factors=20
Iteration 427: time=20.27, Factors=20
Iteration 428: time=20.39, Factors=20
Iteration 429: time=20.43, Factors=20
Iteration 430: time=20.58, Factors=20
Iteration 431: time=20.60, ELBO=-4871563.79, deltaELBO=307.969 (0.00062686%), Factors=20
Iteration 432: time=20.55, Factors=20
Iteration 433: time=20.35, Factors=20
Iteration 434: time=20.33, Factors=20
Iteration 435: time=20.42, Factors=20
Iteration 436: time=20.55, ELBO=-4871215.98, deltaELBO=347.818 (0.00070797%), Factors=20
Iteration 437: time=20.35, Factors=20
Iteration 438: time=20.36, Factors=20
Iteration 439: time=20.22, Factors=20
Iteration 440: time=19.94, Factors=20
Iteration 441: time=20.18, ELBO=-4870923.01, deltaELBO=292.966 (0.00059632%), Factors=20
Iteration 442: time=19.62, Factors=20
Iteration 443: time=18.88, Factors=20
Iteration 444: time=18.23, Factors=20
Iteration 445: time=17.05, Factors=20
Iteration 446: time=16.32, ELBO=-4870656.95, deltaELBO=266.059 (0.00054156%), Factors=20
Iteration 447: time=15.19, Factors=20
Iteration 448: time=14.31, Factors=20
Iteration 449: time=13.63, Factors=20
Iteration 450: time=13.00, Factors=20
Iteration 451: time=12.99, ELBO=-4870399.70, deltaELBO=257.250 (0.00052363%), Factors=20
Iteration 452: time=12.47, Factors=20
Iteration 453: time=12.54, Factors=20
Iteration 454: time=12.47, Factors=20
Iteration 455: time=12.29, Factors=20
Iteration 456: time=12.53, ELBO=-4870098.32, deltaELBO=301.380 (0.00061345%), Factors=20
Iteration 457: time=13.17, Factors=20
Iteration 458: time=12.86, Factors=20
Iteration 459: time=12.80, Factors=20
Iteration 460: time=12.68, Factors=20
Iteration 461: time=12.93, ELBO=-4869817.97, deltaELBO=280.346 (0.00057064%), Factors=20
Iteration 462: time=12.77, Factors=20
Iteration 463: time=12.75, Factors=20
Iteration 464: time=12.78, Factors=20
Iteration 465: time=12.70, Factors=20
Iteration 466: time=12.86, ELBO=-4869510.99, deltaELBO=306.981 (0.00062485%), Factors=20
Iteration 467: time=12.63, Factors=20
Iteration 468: time=12.69, Factors=20
Iteration 469: time=12.66, Factors=20
Iteration 470: time=12.68, Factors=20
Iteration 471: time=12.71, ELBO=-4869253.02, deltaELBO=257.976 (0.00052510%), Factors=20
Iteration 472: time=12.57, Factors=20
Iteration 473: time=12.53, Factors=20
Iteration 474: time=12.49, Factors=20
Iteration 475: time=12.62, Factors=20
Iteration 476: time=12.63, ELBO=-4869007.54, deltaELBO=245.472 (0.00049965%), Factors=20
Iteration 477: time=12.51, Factors=20
Iteration 478: time=12.43, Factors=20
Iteration 479: time=12.59, Factors=20
Iteration 480: time=12.60, Factors=20
Iteration 481: time=12.51, ELBO=-4868782.17, deltaELBO=225.372 (0.00045874%), Factors=20

Converged!



#######################
## Training finished ##
#######################


Warning: Output file /nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model.hdf5 already exists, it will be replaced
Saving model in /nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model.hdf5...
Factor(s) 1, 2, 3, 6, 10 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total 'levels' between your samples, *sometimes* because of poor normalisation in the preprocessing steps.

Load trained model

myeloid_mofa_trained <- load_model(outfile)
Factor(s) 1, 2, 3, 6, 10 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total 'levels' between your samples, *sometimes* because of poor normalisation in the preprocessing steps.
Warning message:
In system("timedatectl", intern = TRUE) :
  running command 'timedatectl' had status 1
plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 1:10)

plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 11:20)

Plot weights correlation across organs (are the same genes related to a factor)

Add some covariates

Factor 1

plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 1)
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls

Factor 4

Factor 6

plot_factor(myeloid_mofa_trained, factors = 6, color_by = "method")
plot_data_heatmap(myeloid_mofa_trained, view="BM", factor = 6)
gs <- get_view_genes(myeloid_mofa_trained, view="BM", factor=6)
plot_view_genes(gs)
plot_view_genes(gs, filter_anno = c("DC3"))

Factor 7

Factor 8

plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 8)

plot_data_heatmap(myeloid_mofa_trained, view="BM", factor = 8, annotation_samples = "group")
plot_data_heatmap(myeloid_mofa_trained, view="LI", factor = 8, annotation_samples = "group")

plot_data_heatmap(myeloid_mofa_trained, view="SK", factor = 8, annotation_samples = "group")

# sapply(get_weights(myeloid_mofa_trained,  factors = 8, as.data.frame = FALSE), function(v) v[,1]) 

Factor 9

Factor 11

plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 11)

Factor 12

Factor 13

plot_variance_explained(myeloid_mofa_trained, y = "group", factors = 13)

Factor 14

Make signatures from latent factors

get_weights()

Model 2 - Normal MOFA / only celltypes as groups

Make MOFA object. Use - Celltypes as groups

myeloid_mofa <- create_mofa_from_SingleCellExperiment(myeloid_sce, assay = "scaled_logcounts", groups = "anno_lvl_2")
myeloid_mofa
Untrained MOFA model with the following characteristics: 
 Number of views: 1 
 Views names: scaled_logcounts 
 Number of features (per view): 4256 
 Number of groups: 19 
 Groups names: Basophil CD14_monocyte CLP DC_progen DC1 DC2 DC3 Eosinophil_MOP ERY_MAC GMP HSC_MPP MAC MAST_cell Mono_Mac MPP_MYE myelocyte neutrophil promonocyte Promyelocyte 
 Number of samples (per group): 62 110 66 17 62 105 96 59 60 43 54 44 59 60 49 17 71 97 52 
 

Prepare 4 training

data_opts <- get_default_data_options(myeloid_mofa)
data_opts$center_groups <- FALSE

model_opts <- get_default_model_options(myeloid_mofa)
model_opts$num_factors <- 20

train_opts <- get_default_training_options(myeloid_mofa)
train_opts$seed <- 2020
train_opts$convergence_mode <- "medium" # use "fast" for faster training
train_opts$stochastic <- FALSE

mefisto_opts <- get_default_mefisto_options(myeloid_mofa)
mefisto_opts$warping <- FALSE
# mefisto_opts$sparseGP <- TRUE

myeloid_mofa <- prepare_mofa(
  object = myeloid_mofa,
  data_options = data_opts,
  model_options = model_opts,
  training_options = train_opts,
  mefisto_options = mefisto_opts
) 

# Multi-group mode requested.

This is an advanced option, if this is the first time that you are running MOFA, we suggest that you try do some exploration first without specifying groups. Two important remarks:

 - The aim of the multi-group framework is to identify the sources of variability *within* the groups. If your aim is to find a factor that 'separates' the groups, you DO NOT want to use the multi-group framework. Please see the FAQ in (https://biofam.github.io/MOFA2)

 - It is important to account for the group effect before selecting highly variable features (HVFs). We suggest that either you calculate HVFs per group and then take the union, or regress out the group effect before HVF selection
Checking data options...
Checking training options...
Checking model options...

Train

outfile <- "/nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model_oneview.hdf5"
myeloid_mofa_trained <- run_mofa(myeloid_mofa, outfile = outfile)
Warning: Output file /nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model_oneview.hdf5 already exists, it will be replaced
Connecting to the mofapy2 python package using reticulate (use_basilisk = FALSE)... 
    Please make sure to manually specify the right python binary when loading R with reticulate::use_python(..., force=TRUE) or the right conda environment with reticulate::use_condaenv(..., force=TRUE)
    If you prefer to let us automatically install a conda environment with 'mofapy2' installed using the 'basilisk' package, please use the argument 'use_basilisk = TRUE'

        #########################################################
        ###           __  __  ____  ______                    ### 
        ###          |  \/  |/ __ \|  ____/\    _             ### 
        ###          | \  / | |  | | |__ /  \ _| |_           ### 
        ###          | |\/| | |  | |  __/ /\ \_   _|          ###
        ###          | |  | | |__| | | / ____ \|_|            ###
        ###          |_|  |_|\____/|_|/_/    \_\              ###
        ###                                                   ### 
        ######################################################### 
       
 
        
Successfully loaded view='scaled_logcounts' group='Basophil' with N=62 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='CD14_monocyte' with N=110 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='CLP' with N=66 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='DC_progen' with N=17 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='DC1' with N=62 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='DC2' with N=105 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='DC3' with N=96 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='Eosinophil_MOP' with N=59 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='ERY_MAC' with N=60 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='GMP' with N=43 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='HSC_MPP' with N=54 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='MAC' with N=44 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='MAST_cell' with N=59 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='Mono_Mac' with N=60 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='MPP_MYE' with N=49 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='myelocyte' with N=17 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='neutrophil' with N=71 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='promonocyte' with N=97 samples and D=4256 features...
Successfully loaded view='scaled_logcounts' group='Promyelocyte' with N=52 samples and D=4256 features...


Model options:
- Automatic Relevance Determination prior on the factors: True
- Automatic Relevance Determination prior on the weights: True
- Spike-and-slab prior on the factors: False
- Spike-and-slab prior on the weights: True
Likelihoods:
- View 0 (scaled_logcounts): gaussian




######################################
## Training the model with seed 2020 ##
######################################


ELBO before training: -64791262.34 

Iteration 1: time=5.15, ELBO=-1940142.21, deltaELBO=62851120.124 (97.00554960%), Factors=20
Iteration 2: time=5.17, Factors=20
Iteration 3: time=5.07, Factors=20
Iteration 4: time=5.10, Factors=20
Iteration 5: time=5.04, Factors=20
Iteration 6: time=4.88, ELBO=7790.37, deltaELBO=1947932.588 (3.00647420%), Factors=20
Iteration 7: time=4.82, Factors=20
Iteration 8: time=4.76, Factors=20
Iteration 9: time=4.59, Factors=20
Iteration 10: time=4.64, Factors=20
Iteration 11: time=4.73, ELBO=111294.38, deltaELBO=103504.005 (0.15974994%), Factors=20
Iteration 12: time=4.66, Factors=20
Iteration 13: time=4.69, Factors=20
Iteration 14: time=4.80, Factors=20
Iteration 15: time=4.61, Factors=20
Iteration 16: time=4.70, ELBO=146662.93, deltaELBO=35368.552 (0.05458846%), Factors=20
Iteration 17: time=4.69, Factors=20
Iteration 18: time=4.60, Factors=20
Iteration 19: time=4.70, Factors=20
Iteration 20: time=4.69, Factors=20
Iteration 21: time=4.75, ELBO=156218.74, deltaELBO=9555.811 (0.01474861%), Factors=20
Iteration 22: time=4.67, Factors=20
Iteration 23: time=4.54, Factors=20
Iteration 24: time=4.72, Factors=20
Iteration 25: time=4.67, Factors=20
Iteration 26: time=4.80, ELBO=160586.75, deltaELBO=4368.004 (0.00674166%), Factors=20
Iteration 27: time=4.66, Factors=20
Iteration 28: time=4.71, Factors=20
Iteration 29: time=4.68, Factors=20
Iteration 30: time=4.61, Factors=20
Iteration 31: time=4.74, ELBO=162870.20, deltaELBO=2283.457 (0.00352433%), Factors=20
Iteration 32: time=4.75, Factors=20
Iteration 33: time=4.71, Factors=20
Iteration 34: time=4.70, Factors=20
Iteration 35: time=4.69, Factors=20
Iteration 36: time=4.77, ELBO=164216.73, deltaELBO=1346.527 (0.00207825%), Factors=20
Iteration 37: time=4.43, Factors=20
Iteration 38: time=4.72, Factors=20
Iteration 39: time=4.50, Factors=20
Iteration 40: time=4.59, Factors=20
Iteration 41: time=4.73, ELBO=165066.98, deltaELBO=850.245 (0.00131228%), Factors=20
Iteration 42: time=4.58, Factors=20
Iteration 43: time=4.70, Factors=20
Iteration 44: time=4.69, Factors=20
Iteration 45: time=4.71, Factors=20
Iteration 46: time=4.75, ELBO=165691.45, deltaELBO=624.477 (0.00096383%), Factors=20
Iteration 47: time=4.65, Factors=20
Iteration 48: time=4.67, Factors=20
Iteration 49: time=4.69, Factors=20
Iteration 50: time=4.70, Factors=20
Iteration 51: time=4.74, ELBO=213469.63, deltaELBO=47778.175 (0.07374170%), Factors=20
Iteration 52: time=4.66, Factors=20
Iteration 53: time=4.72, Factors=20
Iteration 54: time=4.71, Factors=20
Iteration 55: time=4.71, Factors=20
Iteration 56: time=4.71, ELBO=215587.54, deltaELBO=2117.909 (0.00326882%), Factors=20
Iteration 57: time=4.69, Factors=20
Iteration 58: time=4.61, Factors=20
Iteration 59: time=4.69, Factors=20
Iteration 60: time=4.60, Factors=20
Iteration 61: time=4.72, ELBO=216209.92, deltaELBO=622.384 (0.00096060%), Factors=20
Iteration 62: time=4.67, Factors=20
Iteration 63: time=4.70, Factors=20
Iteration 64: time=4.65, Factors=20
Iteration 65: time=4.65, Factors=20
Iteration 66: time=4.75, ELBO=216619.35, deltaELBO=409.428 (0.00063192%), Factors=20
Iteration 67: time=4.60, Factors=20
Iteration 68: time=4.50, Factors=20
Iteration 69: time=4.98, Factors=20
Iteration 70: time=4.47, Factors=20
Iteration 71: time=4.74, ELBO=216946.72, deltaELBO=327.372 (0.00050527%), Factors=20
Iteration 72: time=4.66, Factors=20
Iteration 73: time=4.52, Factors=20
Iteration 74: time=4.59, Factors=20
Iteration 75: time=4.70, Factors=20
Iteration 76: time=4.95, ELBO=217229.16, deltaELBO=282.439 (0.00043592%), Factors=20
Iteration 77: time=5.14, Factors=20
Iteration 78: time=4.82, Factors=20
Iteration 79: time=4.70, Factors=20
Iteration 80: time=4.68, Factors=20
Iteration 81: time=4.74, ELBO=217441.31, deltaELBO=212.147 (0.00032743%), Factors=20

Converged!



#######################
## Training finished ##
#######################


Warning: Output file /nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model_oneview.hdf5 already exists, it will be replaced
Saving model in /nfs/team205/ed6/data/Fetal_immune/myeloid_mofa_model_oneview.hdf5...
2 factors were found to explain no variance and they were removed for downstream analysis. You can disable this option by setting load_model(..., remove_inactive_factors = FALSE)
myeloid_mofa_trained <- load_model(outfile)
Factor(s) 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total 'levels' between your samples, *sometimes* because of poor normalisation in the preprocessing steps.

Add some covariates


samples_metadata(myeloid_mofa_trained)  <- samples_metadata(myeloid_mofa_trained) %>%
  mutate(time=myeloid_sce[,match(samples_metadata(myeloid_mofa_trained)$sample, colnames(myeloid_sce))]$age,
         method=myeloid_sce[,match(samples_metadata(myeloid_mofa_trained)$sample, colnames(myeloid_sce))]$method,
         donor=myeloid_sce[,match(samples_metadata(myeloid_mofa_trained)$sample, colnames(myeloid_sce))]$donor,
         organ=myeloid_sce[,match(samples_metadata(myeloid_mofa_trained)$sample, colnames(myeloid_sce))]$organ)

Plot by celltype

get_variance_explained(myeloid_mofa_trained, as.data.frame = TRUE)[[1]] %>%
  ggplot(aes(factor, value)) + geom_col() +
  coord_flip() +
  facet_wrap(group~., ncol = 6, scales = "free_x")

get_variance_explained(myeloid_mofa_trained, as.data.frame = TRUE, views = "scaled_logcounts")[[1]] %>%
  pivot_wider(id_cols=c(group), names_from=factor, values_from=value) %>%
  column_to_rownames("group") %>%
  as.matrix() %>%
  t() %>%
  cor() %>%
  pheatmap::pheatmap()

for (f in colnames(myeloid_mofa_trained@expectations$W$scaled_logcounts)){
  print(plot_factor(myeloid_mofa_trained, factors = f, group_by = "group", color_by = "organ", dot_size = 0.8, add_boxplot = TRUE, dodge = TRUE))
}

Insights so far:

  1. Factor1:
  2. Factor2:
  3. Factor3: MAST/Baso/Eo vs rest
  4. Factor4: DC1 signature, TH specific
  5. Factor5: MAST/Baso/Eo, low in BM
  6. Factor6: progenitors signal, correlated with age (progenitor maturation?)
  7. Factor7: differences within ERY_MAC, more expression of hemoglobin genes in liver and bone marrow than SK 8/9. Factors 8 and 9 look technical (heatshock proteins)
  8. CLP vs GMP signature (BM vs SP and LI)
  9. Factor 14: GU specific DC and Mono signature

plot_weights(myeloid_mofa_trained, factors = 4, nfeatures = 50, text_size = 6)
Warning message:
In system("timedatectl", intern = TRUE) :
  running command 'timedatectl' had status 1

Go by celltype instead of factor

DC1

Explore by factor

plot_factor(myeloid_mofa_trained, factor = 3)

plot_weights(myeloid_mofa_trained, factor = 3, nfeatures = 20)

Find factors that discriminate between organs

Model 3 - MEFISTO

Add time as covariate to run MEFISTO

```r
## Vector for time assignment
times <- distinct(data.frame(age=myeloid_sce$age, new_sample)) %>%
  column_to_rownames('new_sample') %>%
  .[sample_names_unique,]

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiTW9kZWwgb3B0aW9uczpcbi0gQXV0b21hdGljIFJlbGV2YW5jZSBEZXRlcm1pbmF0aW9uIHByaW9yIG9uIHRoZSBmYWN0b3JzOiBUcnVlXG4tIEF1dG9tYXRpYyBSZWxldmFuY2UgRGV0ZXJtaW5hdGlvbiBwcmlvciBvbiB0aGUgd2VpZ2h0czogVHJ1ZVxuLSBTcGlrZS1hbmQtc2xhYiBwcmlvciBvbiB0aGUgZmFjdG9yczogRmFsc2Vcbi0gU3Bpa2UtYW5kLXNsYWIgcHJpb3Igb24gdGhlIHdlaWdodHM6IFRydWVcbkxpa2VsaWhvb2RzOlxuLSBWaWV3IDAgKEJNKTogZ2F1c3NpYW5cbi0gVmlldyAxIChHVSk6IGdhdXNzaWFuXG4tIFZpZXcgMiAoS0kpOiBnYXVzc2lhblxuLSBWaWV3IDMgKExJKTogZ2F1c3NpYW5cbi0gVmlldyA0IChNTE4pOiBnYXVzc2lhblxuLSBWaWV3IDUgKFNLKTogZ2F1c3NpYW5cbi0gVmlldyA2IChTUCk6IGdhdXNzaWFuXG4tIFZpZXcgNyAoVEgpOiBnYXVzc2lhblxuLSBWaWV3IDggKFlTKTogZ2F1c3NpYW5cbiJ9 -->

Model options: - Automatic Relevance Determination prior on the factors: True - Automatic Relevance Determination prior on the weights: True - Spike-and-slab prior on the factors: False - Spike-and-slab prior on the weights: True Likelihoods: - View 0 (BM): gaussian - View 1 (GU): gaussian - View 2 (KI): gaussian - View 3 (LI): gaussian - View 4 (MLN): gaussian - View 5 (SK): gaussian - View 6 (SP): gaussian - View 7 (TH): gaussian - View 8 (YS): gaussian




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2FtcGxlc19tZXRhZGF0YShteWVsb2lkX21vZmEpW1tcXHRpbWVcXF1dIDwtIHRpbWVzXG5cbm15ZWxvaWRfbW9mYSA8LSBzZXRfY292YXJpYXRlcyhteWVsb2lkX21vZmEsIGNvdmFyaWF0ZXMgPSBcXHRpbWVcXClcbm15ZWxvaWRfbW9mYVxuYGBgXG5gYGAifQ== -->

```r
```r
samples_metadata(myeloid_mofa)[[\time\]] <- times

myeloid_mofa <- set_covariates(myeloid_mofa, covariates = \time\)
myeloid_mofa

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiVW50cmFpbmVkIE1FRklTVE8gbW9kZWwgd2l0aCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczogXG4gTnVtYmVyIG9mIHZpZXdzOiA5IFxuIFZpZXdzIG5hbWVzOiBCTSBHVSBLSSBMSSBNTE4gU0sgU1AgVEggWVMgXG4gTnVtYmVyIG9mIGZlYXR1cmVzIChwZXIgdmlldyk6IDY4NTcgNjg1NyA2ODU3IDY4NTcgNjg1NyA2ODU3IDY4NTcgNjg1NyA2ODU3IFxuIE51bWJlciBvZiBncm91cHM6IDE5IFxuIEdyb3VwcyBuYW1lczogQmFzb3BoaWwgQ0QxNF9tb25vY3l0ZSBDTFAgRENfcHJvZ2VuIERDMSBEQzIgREMzIEVvc2lub3BoaWxfTU9QIEVSWV9NQUMgR01QIEhTQ19NUFAgTUFDIE1BU1RfY2VsbCBNb25vX01hYyBNUFBfTVlFIG15ZWxvY3l0ZSBuZXV0cm9waGlsIHByb21vbm9jeXRlIFByb215ZWxvY3l0ZSBcbiBOdW1iZXIgb2Ygc2FtcGxlcyAocGVyIGdyb3VwKTogMjAgMjUgMjEgMTEgMjIgMjkgMjQgMTkgMjMgMTcgMTkgMjIgMjAgMjUgMTggOCAyMSAyMyAxOSBcbiBOdW1iZXIgb2YgY292YXJpYXRlcyBwZXIgc2FtcGxlOiAxIFxuIFxuIn0= -->

Untrained MEFISTO model with the following characteristics: Number of views: 9 Views names: BM GU KI LI MLN SK SP TH YS Number of features (per view): 6857 6857 6857 6857 6857 6857 6857 6857 6857 Number of groups: 19 Groups names: Basophil CD14_monocyte CLP DC_progen DC1 DC2 DC3 Eosinophil_MOP ERY_MAC GMP HSC_MPP MAC MAST_cell Mono_Mac MPP_MYE myelocyte neutrophil promonocyte Promyelocyte Number of samples (per group): 20 25 21 11 22 29 24 19 23 17 19 22 20 25 18 8 21 23 19 Number of covariates per sample: 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZ2dfaW5wdXQgPC0gcGxvdF9kYXRhX292ZXJ2aWV3KG15ZWxvaWRfbW9mYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NvdmFyaWF0ZSA9IFRSVUUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19kaW1lbnNpb25zID0gVFJVRSkgXG5nZ19pbnB1dFxuYGBgXG5gYGAifQ== -->

```r
```r
gg_input <- plot_data_overview(myeloid_mofa,
                               show_covariate = TRUE,
                               show_dimensions = TRUE) 
gg_input

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<!-- Keep groups that span multiple views -->
<!-- ```{r} -->
<!-- gr_samples <- split(samples_metadata(myeloid_mofa)$sample, samples_metadata(myeloid_mofa)$group) -->
<!-- all(is.na(data$BM[,gr_samples$Basophil])) -->
<!-- lapply(unique(samples_metadata(myeloid_mofa)[["group"]]), function(x) data$BM[]) -->


<!-- myeloid_mofa@data -->
<!-- subse(myeloid_mofa)[,samples_metadata(myeloid_mofa)[["group"]] == "Basophil"] -->
<!-- ``` -->

Prepare 4 training


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YV9vcHRzIDwtIGdldF9kZWZhdWx0X2RhdGFfb3B0aW9ucyhteWVsb2lkX21vZmEpXG5cbm1vZGVsX29wdHMgPC0gZ2V0X2RlZmF1bHRfbW9kZWxfb3B0aW9ucyhteWVsb2lkX21vZmEpXG5tb2RlbF9vcHRzJG51bV9mYWN0b3JzIDwtIDEwXG5cbnRyYWluX29wdHMgPC0gZ2V0X2RlZmF1bHRfdHJhaW5pbmdfb3B0aW9ucyhteWVsb2lkX21vZmEpXG50cmFpbl9vcHRzJHNlZWQgPC0gMjAyMFxudHJhaW5fb3B0cyRjb252ZXJnZW5jZV9tb2RlIDwtIFxcZmFzdFxcICMgdXNlIFxcZmFzdFxcIGZvciBmYXN0ZXIgdHJhaW5pbmdcblxubWVmaXN0b19vcHRzIDwtIGdldF9kZWZhdWx0X21lZmlzdG9fb3B0aW9ucyhteWVsb2lkX21vZmEpXG5tZWZpc3RvX29wdHMkd2FycGluZyA8LSBGQUxTRVxuIyBtZWZpc3RvX29wdHMkc3BhcnNlR1AgPC0gVFJVRVxuXG5teWVsb2lkX21vZmEgPC0gcHJlcGFyZV9tb2ZhKFxuICBvYmplY3QgPSBteWVsb2lkX21vZmEsXG4gIGRhdGFfb3B0aW9ucyA9IGRhdGFfb3B0cyxcbiAgbW9kZWxfb3B0aW9ucyA9IG1vZGVsX29wdHMsXG4gIHRyYWluaW5nX29wdGlvbnMgPSB0cmFpbl9vcHRzLFxuICBtZWZpc3RvX29wdGlvbnMgPSBtZWZpc3RvX29wdHNcbikgXG5gYGBcbmBgYCJ9 -->

```r
```r
data_opts <- get_default_data_options(myeloid_mofa)

model_opts <- get_default_model_options(myeloid_mofa)
model_opts$num_factors <- 10

train_opts <- get_default_training_options(myeloid_mofa)
train_opts$seed <- 2020
train_opts$convergence_mode <- \fast\ # use \fast\ for faster training

mefisto_opts <- get_default_mefisto_options(myeloid_mofa)
mefisto_opts$warping <- FALSE
# mefisto_opts$sparseGP <- TRUE

myeloid_mofa <- prepare_mofa(
  object = myeloid_mofa,
  data_options = data_opts,
  model_options = model_opts,
  training_options = train_opts,
  mefisto_options = mefisto_opts
) 

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG4jIE11bHRpLWdyb3VwIG1vZGUgcmVxdWVzdGVkLlxuXG5UaGlzIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiwgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHlvdSBhcmUgcnVubmluZyBNT0ZBLCB3ZSBzdWdnZXN0IHRoYXQgeW91IHRyeSBkbyBzb21lIGV4cGxvcmF0aW9uIGZpcnN0IHdpdGhvdXQgc3BlY2lmeWluZyBncm91cHMuIFR3byBpbXBvcnRhbnQgcmVtYXJrczpcblxuIC0gVGhlIGFpbSBvZiB0aGUgbXVsdGktZ3JvdXAgZnJhbWV3b3JrIGlzIHRvIGlkZW50aWZ5IHRoZSBzb3VyY2VzIG9mIHZhcmlhYmlsaXR5ICp3aXRoaW4qIHRoZSBncm91cHMuIElmIHlvdXIgYWltIGlzIHRvIGZpbmQgYSBmYWN0b3IgdGhhdCAnc2VwYXJhdGVzJyB0aGUgZ3JvdXBzLCB5b3UgRE8gTk9UIHdhbnQgdG8gdXNlIHRoZSBtdWx0aS1ncm91cCBmcmFtZXdvcmsuIFBsZWFzZSBzZWUgdGhlIEZBUSBpbiAoaHR0cHM6Ly9iaW9mYW0uZ2l0aHViLmlvL01PRkEyKVxuXG4gLSBJdCBpcyBpbXBvcnRhbnQgdG8gYWNjb3VudCBmb3IgdGhlIGdyb3VwIGVmZmVjdCBiZWZvcmUgc2VsZWN0aW5nIGhpZ2hseSB2YXJpYWJsZSBmZWF0dXJlcyAoSFZGcykuIFdlIHN1Z2dlc3QgdGhhdCBlaXRoZXIgeW91IGNhbGN1bGF0ZSBIVkZzIHBlciBncm91cCBhbmQgdGhlbiB0YWtlIHRoZSB1bmlvbiwgb3IgcmVncmVzcyBvdXQgdGhlIGdyb3VwIGVmZmVjdCBiZWZvcmUgSFZGIHNlbGVjdGlvblxuQ2hlY2tpbmcgZGF0YSBvcHRpb25zLi4uXG5DaGVja2luZyB0cmFpbmluZyBvcHRpb25zLi4uXG5TdG9jaGFzdGljIGluZmVyZW5jZSBhY3RpdmF0ZWQuIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgcmVjb21tZW5kZWQgaWYgeW91IGhhdmUgYSB2ZXJ5IGxhcmdlIHNhbXBsZSBzaXplICg+MWU0KSBhbmQgYWNjZXNzIHRvIGEgR1BVXG5ObyBzdG9jaGFzdGljIG9wdGlvbnMgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0Li4uXG5DaGVja2luZyBtb2RlbCBvcHRpb25zLi4uXG5DaGVja2luZyBpbmZlcmVuY2Ugb3B0aW9ucyBmb3IgbWVmaXN0byBjb3ZhcmlhdGVzLi4uXG4ifQ== -->

Multi-group mode requested.

This is an advanced option, if this is the first time that you are running MOFA, we suggest that you try do some exploration first without specifying groups. Two important remarks:




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## Train


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub3V0ZmlsZSA8LSBcIi9uZnMvdGVhbTIwNS9lZDYvZGF0YS9GZXRhbF9pbW11bmUvbXllbG9pZF9tZWZpc3RvX21vZGVsLmhkZjVcIlxubXllbG9pZF9tb2ZhX3RyYWluZWQgPC0gcnVuX21vZmEobXllbG9pZF9tb2ZhLCBvdXRmaWxlID0gb3V0ZmlsZSlcbmBgYCJ9 -->

```r
outfile <- "/nfs/team205/ed6/data/Fetal_immune/myeloid_mefisto_model.hdf5"
myeloid_mofa_trained <- run_mofa(myeloid_mofa, outfile = outfile)

Load trained model

```r
myeloid_mofa_trained <- load_model(outfile, load_interpol_Z = TRUE)

```

LS0tCnRpdGxlOiAiTUVGSVNUTyBvbiBwYW4tZmV0YWwgaW1tdW5lIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoTU9GQTIpCiAgbGlicmFyeShNYXRyaXgpCiAgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHNjcmFuKX0KICApCmBgYAoKIyMgTG9hZCBwc2V1ZG9idWxrZWQgZGF0YQoKYGBge3J9CmluZGlyIDwtICIvbmZzL3RlYW0yMDUvZWQ2L2RhdGEvRmV0YWxfaW1tdW5lL0xNTV9kYXRhL0xNTV9pbnB1dF9NWUVMT0lEX1BCVUxLLyIKCm1hdHJpeCA8LSByZWFkTU0oZmlsZSA9IHBhc3RlMChpbmRpciwgIm1hdHJpeC5tdHguZ3oiKSkKY29sZGF0YSA8LSByZWFkLmNzdihmaWxlID0gcGFzdGUwKGluZGlyLCAibWV0YWRhdGEuY3N2Lmd6IikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiWCIpCnJvd2RhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IHBhc3RlMChpbmRpciwgImdlbmUuY3N2Lmd6IikpIAoKIyMgTWFrZSBTaW5nbGVDZWxsRXhwZXJpbWVudCBvYmoKbXllbG9pZF9zY2UgPC0gU2luZ2xlQ2VsbEV4cGVyaW1lbnQobGlzdChsb2djb3VudHMgPSB0KG1hdHJpeCkpLCBjb2xEYXRhID0gY29sZGF0YSkKcm93bmFtZXMobXllbG9pZF9zY2UpIDwtIG1ha2UudW5pcXVlKHJvd2RhdGEkR2VuZU5hbWUpIApgYGAKCgojIyBQcmVwcm9jZXNzaW5nCgpFeGNsdWRlIGNlbGx0eXBlcyBwcmVzZW50IGluIGp1c3Qgb25lIG9yZ2FuCmBgYHtyfQprZWVwX2N0IDwtIGRhdGEuZnJhbWUoY29sRGF0YShteWVsb2lkX3NjZSkpICU+JQogIHNlbGVjdChvcmdhbiwgYW5ub19sdmxfMikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBncm91cF9ieShhbm5vX2x2bF8yKSAlPiUKICBzdW1tYXJpc2Uobj1uKCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIobiA+IDEpICU+JQogIHB1bGwoYW5ub19sdmxfMikKCm15ZWxvaWRfc2NlIDwtIG15ZWxvaWRfc2NlWyxteWVsb2lkX3NjZSRhbm5vX2x2bF8yICVpbiUga2VlcF9jdF0KbXllbG9pZF9zY2UKYGBgCgpGZWF0dXJlIHNlbGVjdGlvbjogb3B0aW9ucyBoZXJlCgotIHNlbGVjdCBIVkdTIHdpdGggc2NyYW4KLSB1c2Ugc2FtZSBIVkdTIHVzZWQgZm9yIGNsdXN0ZXJpbmcKKHRoZXNlIG9wdGlvbnMgZG9uJ3QgbWF4aW1pemUgdmFyaWF0aW9uIGJldHdlZW4gb3JnYW5zKQotICoqRmluZCBIVkdTIHdpdGhpbiBlYWNoIGNlbGx0eXBlIGFuZCB0YWtlIHVuaW9uKioKCmBgYHtyfQojIGFsbF9vYnMgPC0gcmVhZF9jc3YoIi9uZnMvdGVhbTIwNS9lZDYvZGF0YS9GZXRhbF9pbW11bmUvUEFOLkEwMS52MDEuZW50aXJlX2RhdGFfbm9ybWFsaXNlZF9sb2cud0d1dC5iYXRjaENvcnJlY3RlZF8yMDIxMDExOC4iKQoKIyMgRmVhdHVyZSBzZWxlY3Rpb24gdyBzY3JhbiBXSVRISU4gQ0VMTFRZUEUKYW5ub19ncm91cHMgPC0gc3BsaXQoY29sbmFtZXMobXllbG9pZF9zY2UpLCBteWVsb2lkX3NjZSRhbm5vX2x2bF8yKQphbGxfaHZncyA8LSBjKCkKZm9yIChpIGluIGFubm9fZ3JvdXBzKXsKICBkZWMgPC0gbW9kZWxHZW5lVmFyKG15ZWxvaWRfc2NlWyxpXSkKICBodmdzIDwtIGdldFRvcEhWR3MoZGVjLCBuID0gMTAwMCkKICBhbGxfaHZncyA8LSB1bmlvbihhbGxfaHZncywgaHZncykKICB9CgpteWVsb2lkX3NjZSA8LSBteWVsb2lkX3NjZVthbGxfaHZncyxdCm15ZWxvaWRfc2NlIDwtIG15ZWxvaWRfc2NlW3doaWNoKHJvd1N1bXMobG9nY291bnRzKG15ZWxvaWRfc2NlKSkgPiAwKSxdCm15ZWxvaWRfc2NlCmBgYAoKU2NhbGUKYGBge3J9CmFzc2F5KG15ZWxvaWRfc2NlLCAic2NhbGVkX2xvZ2NvdW50cyIpIDwtIHQoc2NhbGUodChsb2djb3VudHMobXllbG9pZF9zY2UpKSkpCmBgYAoKRURBIHdpdGggUENBCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTV9CmxpYnJhcnkoc2NhdGVyKQpteWVsb2lkX3NjZSA8LSBydW5QQ0EobXllbG9pZF9zY2UsIHNjYWxlPUZBTFNFLCBuY29tcG9uZW50cz0zMCkKCiMjIFZhcmlhbmNlIGV4cGxhaW5lZApwZXJjZW50LnZhciA8LSBhdHRyKHJlZHVjZWREaW0obXllbG9pZF9zY2UpLCAicGVyY2VudFZhciIpCnBsb3QocGVyY2VudC52YXIsIGxvZz0ieSIsIHhsYWI9IlBDIiwgeWxhYj0iVmFyaWFuY2UgZXhwbGFpbmVkICglKSIpCgpwbG90UENBKG15ZWxvaWRfc2NlLCBjb2xvdXJfYnk9Im9yZ2FuIiwgbmNvbXBvbmVudHM9NikKcGxvdFBDQShteWVsb2lkX3NjZSwgY29sb3VyX2J5PSJhbm5vX2x2bF8yIiwgbmNvbXBvbmVudHM9NikKYGBgCmBgYHtyfQpwbG90UENBKG15ZWxvaWRfc2NlLCBjb2xvdXJfYnk9ImFubm9fbHZsXzIiLCB0ZXh0X2J5PSJhbm5vX2x2bF8yIikKcGxvdFBDQShteWVsb2lkX3NjZSwgY29sb3VyX2J5PSJvcmdhbiIsIHRleHRfYnk9ImFubm9fbHZsXzIiKQpgYGAKCk1pbmltaXplIG9idmlvdXMgdGVjaG5pY2FsIGVmZmVjdHMgKDNHRVgvNUdFWCkgdXNpbmcgbGluZWFyIHJlZ3Jlc3Npb24gKGZvbGxvd2luZyBwcm9jZWR1cmUgZnJvbSBbT1NDQV0oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzL3JlbGVhc2UvT1NDQS9pbnRlZ3JhdGluZy1kYXRhc2V0cy5odG1sI2xpbmVhci1yZWdyZXNzaW9uKSkKCmBgYHtyfQpsaWJyYXJ5KGJhdGNoZWxvcikKbXllbG9pZF9zY2VfM2dleCA8LSBteWVsb2lkX3NjZVssbXllbG9pZF9zY2UkbWV0aG9kPT0iM0dFWCJdCm15ZWxvaWRfc2NlXzVnZXggPC0gbXllbG9pZF9zY2VbLG15ZWxvaWRfc2NlJG1ldGhvZD09IjVHRVgiXQoKc2V0LnNlZWQoMTAwMDEpCnJlc2lkdWFscyA8LSByZWdyZXNzQmF0Y2hlcyhteWVsb2lkX3NjZV8zZ2V4LCBteWVsb2lkX3NjZV81Z2V4LCBkPTMwLAogICAgYXNzYXkudHlwZSA9ICJsb2djb3VudHMiLAogICAgY29ycmVjdC5hbGw9VFJVRSwKICAgIEJTUEFSQU09QmlvY1Npbmd1bGFyOjpSYW5kb21QYXJhbSgpKQoKYXNzYXkobXllbG9pZF9zY2UsICJzY2FsZWRfbG9nY291bnRzIikgPC0gYXMubWF0cml4KGFzc2F5KHJlc2lkdWFsc1ssY29sbmFtZXMobXllbG9pZF9zY2UpXSwgImNvcnJlY3RlZCIpKQoKYGBgCgojIE1vZGVsIDEgLSBOb3JtYWwgTU9GQSAvIG9yZ2FucyBhcyB2aWV3cwoKTWFrZSBNT0ZBIG9iamVjdC4gVXNlCi0gT3JnYW4gYXMgdmlldwotIENlbGx0eXBlcyBhcyBncm91cHMKCmBgYHtyfQojIyBTcGxpdCBpbnRvIG9uZSBtYXRyaXggeCBvcmdhbgpvcmdfaXhzIDwtIHNwbGl0KGNvbG5hbWVzKG15ZWxvaWRfc2NlKSwgbXllbG9pZF9zY2Ukb3JnYW4pCmRhdGEgPC0gbGFwcGx5KG9yZ19peHMsIGZ1bmN0aW9uKGkpIGFzc2F5KG15ZWxvaWRfc2NlWyxpXSwgInNjYWxlZF9sb2djb3VudHMiKSkKZGF0YSA8LSBsYXBwbHkoZGF0YSwgYXMubWF0cml4KQoKIyMgQ29sbGFwc2UgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHNhbWUgZG9ub3IvbGlicmFyeSBwcmVwCm5ld19zYW1wbGUgPC0gcGFzdGUobXllbG9pZF9zY2UkZG9ub3IsIG15ZWxvaWRfc2NlJG1ldGhvZCxteWVsb2lkX3NjZSRhbm5vX2x2bF8yLCBzZXA9Ii0iKQpuZXdzYW1wbGVfaXhzIDwtIHNwbGl0KG5ld19zYW1wbGUsIG15ZWxvaWRfc2NlJG9yZ2FuKQpmb3IgKG8gaW4gbmFtZXMoZGF0YSkpewogIGNvbG5hbWVzKGRhdGFbW29dXSkgPC0gbmV3c2FtcGxlX2l4c1tbb11dCn0KCiMjIEZpbGwgbWlzc2luZyB2YWx1ZXMKc2FtcGxlX25hbWVzX3VuaXF1ZSA8LSB1bmlxdWUobmV3X3NhbXBsZSkKZm9yIChvIGluIG5hbWVzKGRhdGEpKXsKICBmb3IgKHMgaW4gc2FtcGxlX25hbWVzX3VuaXF1ZSl7CiAgICBpZiAoIXMgJWluJSBjb2xuYW1lcyhkYXRhW1tvXV0pKSB7CiAgICAgIG0gPC0gbWF0cml4KE5BLCBucm93PW5yb3coZGF0YVtbb11dKSkKICAgICAgY29sbmFtZXMobSkgPC0gcwogICAgICBkYXRhW1tvXV0gPC0gY2JpbmQoZGF0YVtbb11dLCBtKQogICAgfQogIH0KICBkYXRhW1tvXV0gPC0gZGF0YVtbb11dWyxzYW1wbGVfbmFtZXNfdW5pcXVlXQp9CgojIyBWZWN0b3IgZm9yIGdyb3VwIGFzc2lnbm1lbnQKZ3JvdXBzIDwtIHNhcHBseShzdHJzcGxpdChzYW1wbGVfbmFtZXNfdW5pcXVlLCAiLSIpLCBmdW5jdGlvbih4KSB4WzNdKQoKbXllbG9pZF9tb2ZhIDwtIGNyZWF0ZV9tb2ZhX2Zyb21fbWF0cml4KGRhdGEsIGdyb3VwcyA9IGdyb3VwcykKbXllbG9pZF9tb2ZhCmBgYAoKIyMgUmVndWxhciBNT0ZBCmBgYHtyfQpteWVsb2lkX21vZmEKYGBgCgpQcmVwYXJlIDQgdHJhaW5pbmcKCmBgYHtyfQpkYXRhX29wdHMgPC0gZ2V0X2RlZmF1bHRfZGF0YV9vcHRpb25zKG15ZWxvaWRfbW9mYSkKZGF0YV9vcHRzJGNlbnRlcl9ncm91cHMgPC0gRkFMU0UKCm1vZGVsX29wdHMgPC0gZ2V0X2RlZmF1bHRfbW9kZWxfb3B0aW9ucyhteWVsb2lkX21vZmEpCm1vZGVsX29wdHMkbnVtX2ZhY3RvcnMgPC0gMjAKCnRyYWluX29wdHMgPC0gZ2V0X2RlZmF1bHRfdHJhaW5pbmdfb3B0aW9ucyhteWVsb2lkX21vZmEpCnRyYWluX29wdHMkc2VlZCA8LSAyMDIwCnRyYWluX29wdHMkY29udmVyZ2VuY2VfbW9kZSA8LSAiZmFzdCIgIyB1c2UgImZhc3QiIGZvciBmYXN0ZXIgdHJhaW5pbmcKdHJhaW5fb3B0cyRzdG9jaGFzdGljIDwtIEZBTFNFCgptZWZpc3RvX29wdHMgPC0gZ2V0X2RlZmF1bHRfbWVmaXN0b19vcHRpb25zKG15ZWxvaWRfbW9mYSkKbWVmaXN0b19vcHRzJHdhcnBpbmcgPC0gRkFMU0UKIyBtZWZpc3RvX29wdHMkc3BhcnNlR1AgPC0gVFJVRQoKbXllbG9pZF9tb2ZhIDwtIHByZXBhcmVfbW9mYSgKICBvYmplY3QgPSBteWVsb2lkX21vZmEsCiAgZGF0YV9vcHRpb25zID0gZGF0YV9vcHRzLAogIG1vZGVsX29wdGlvbnMgPSBtb2RlbF9vcHRzLAogIHRyYWluaW5nX29wdGlvbnMgPSB0cmFpbl9vcHRzLAogIG1lZmlzdG9fb3B0aW9ucyA9IG1lZmlzdG9fb3B0cwopIApgYGAKCiMjIFRyYWluCgpgYGB7cn0Kb3V0ZmlsZSA8LSAiL25mcy90ZWFtMjA1L2VkNi9kYXRhL0ZldGFsX2ltbXVuZS9teWVsb2lkX21vZmFfbW9kZWwuaGRmNSIKbXllbG9pZF9tb2ZhX3RyYWluZWQgPC0gcnVuX21vZmEobXllbG9pZF9tb2ZhLCBvdXRmaWxlID0gb3V0ZmlsZSkKYGBgCgojIyBMb2FkIHRyYWluZWQgbW9kZWwKYGBge3J9Cm15ZWxvaWRfbW9mYV90cmFpbmVkIDwtIGxvYWRfbW9kZWwob3V0ZmlsZSkKYGBgCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9NX0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gMToxMCkKcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gMTE6MjApCmBgYAoKClBsb3Qgd2VpZ2h0cyBjb3JyZWxhdGlvbiBhY3Jvc3Mgb3JnYW5zIChhcmUgdGhlIHNhbWUgZ2VuZXMgcmVsYXRlZCB0byBhIGZhY3RvcikKCmBgYHtyfQpmb3IgKGYgaW4gY29sbmFtZXMobXllbG9pZF9tb2ZhX3RyYWluZWRAZXhwZWN0YXRpb25zJFckQk0pKXsKICBjb3JtYXQgPC0gY29yKHNhcHBseShnZXRfd2VpZ2h0cyhteWVsb2lkX21vZmFfdHJhaW5lZCwgIGZhY3RvcnMgPSBmLCBhcy5kYXRhLmZyYW1lID0gRkFMU0UpLCBmdW5jdGlvbih2KSB2WywxXSkpIAogIHBoZWF0bWFwOjpwaGVhdG1hcChjb3JtYXQsIG1haW49ZiwgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIGNsdXN0ZXJfY29scyA9IEZBTFNFKQp9CmBgYAoKQWRkIHNvbWUgY292YXJpYXRlcwoKYGBge3J9CnNhbXBsZXNfbWV0YWRhdGEobXllbG9pZF9tb2ZhX3RyYWluZWQpICA8LSBzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYV90cmFpbmVkKSAlPiUKICBtdXRhdGUobWV0aG9kPXNhcHBseShzdHJfc3BsaXQoc2FtcGxlLCItIiksIGZ1bmN0aW9uKHgpIHhbMl0pLAogICAgICAgICBkb25vcj1zYXBwbHkoc3RyX3NwbGl0KHNhbXBsZSwiLSIpLCBmdW5jdGlvbih4KSB4WzFdKSkKCiMjIFZlY3RvciBmb3IgdGltZSBhc3NpZ25tZW50CnRpbWVzIDwtIGRpc3RpbmN0KGRhdGEuZnJhbWUoYWdlPW15ZWxvaWRfc2NlJGFnZSwgbmV3X3NhbXBsZSkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygnbmV3X3NhbXBsZScpICU+JQogIC5bc2FtcGxlX25hbWVzX3VuaXF1ZSxdCgpzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYV90cmFpbmVkKVtbInRpbWUiXV0gPC0gdGltZXMKYGBgCgojIyMgRmFjdG9yIDEKYGBge3J9CnBsb3RfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB5ID0gImdyb3VwIiwgZmFjdG9ycyA9IDEpCmBgYAoKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0KbGlicmFyeShSQ29sb3JCcmV3ZXIpCgpnZXRfdmlld19nZW5lcyA8LSBmdW5jdGlvbihteWVsb2lkX21vZmFfdHJhaW5lZCwgdmlldywgZmFjdG9yLCBuZmVhdHVyZXM9NTApewogIGdlbmVzIDwtIGdldF93ZWlnaHRzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3cz12aWV3LCBmYWN0b3JzID0gZmFjdG9yLCBhcy5kYXRhLmZyYW1lID0gVFJVRSkgJT4lCiAgbXV0YXRlKGZlYXR1cmU9c3RyX3JlbW92ZShmZWF0dXJlLCAiXy4rIikpICU+JQogIG11dGF0ZShyYW5rPXJhbmsoYWJzKHZhbHVlKSkpICU+JQogIHRvcF9uKG5mZWF0dXJlcywgcmFuaykgJT4lCiAgcHVsbChmZWF0dXJlKQogIHJldHVybihnZW5lcykKfQoKcGxvdF92aWV3X2dlbmVzIDwtIGZ1bmN0aW9uKGdzLCBmaWx0ZXJfYW5ubz1OVUxMKXsKICBpZiAoaXMubnVsbChmaWx0ZXJfYW5ubykpIHsKICAgIHBsX21hdCA8LSBhc3NheShteWVsb2lkX3NjZVtncyxdLCAic2NhbGVkX2xvZ2NvdW50cyIpCiAgfSBlbHNlIHsKICAgIHBsX21hdCA8LSBhc3NheShteWVsb2lkX3NjZVtncyxteWVsb2lkX3NjZSRhbm5vX2x2bF8yICVpbiUgZmlsdGVyX2Fubm9dLCAic2NhbGVkX2xvZ2NvdW50cyIpCiAgfQogIHBsX2Fubm8gPC0gZGF0YS5mcmFtZShvcmdhbj1teWVsb2lkX3NjZSRvcmdhbiwgYW5ub3RhdGlvbj1teWVsb2lkX3NjZSRhbm5vX2x2bF8yKQogIHJvd25hbWVzKHBsX2Fubm8pIDwtIGNvbG5hbWVzKG15ZWxvaWRfc2NlKQogIAogIHByaW50KHBoZWF0bWFwOjpwaGVhdG1hcChwbF9tYXQsIGFubm90YXRpb25fY29sPXBsX2Fubm8sIHNob3dfY29sbmFtZXMgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gbGlzdChvcmdhbj1zZXROYW1lcyhicmV3ZXIucGFsKDksICJTcGVjdHJhbCIpLCB1bmlxdWUocGxfYW5ubyRvcmdhbikpKSkpCn0KCmdzIDwtIGdldF92aWV3X2dlbmVzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJCTSIsIGZhY3Rvcj0xKQpwbG90X3ZpZXdfZ2VuZXMoZ3MpCmBgYAoKIyMjIEZhY3RvciA0CgpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTh9CmdzIDwtIGdldF92aWV3X2dlbmVzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJUSCIsIGZhY3Rvcj00KQpwbG90X3ZpZXdfZ2VuZXMoZ3MpCnBsb3Rfdmlld19nZW5lcyhncywgZmlsdGVyX2Fubm8gPSBjKCJEQzEiLCAiRENfcHJvZ2VuIiwgIkRDMiIpKQpgYGAKCiMjIEZhY3RvciA2CgpgYGB7cn0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gNikKYGBgCgpgYGB7cn0KcGxvdF9mYWN0b3IobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSA2LCBjb2xvcl9ieSA9ICJtZXRob2QiKQpgYGAKYGBge3J9CnBsb3RfZGF0YV9oZWF0bWFwKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJCTSIsIGZhY3RvciA9IDYpCmBgYAoKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0KZ3MgPC0gZ2V0X3ZpZXdfZ2VuZXMobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IkJNIiwgZmFjdG9yPTYpCnBsb3Rfdmlld19nZW5lcyhncykKcGxvdF92aWV3X2dlbmVzKGdzLCBmaWx0ZXJfYW5ubyA9IGMoIkRDMyIpKQpgYGAKCiMjIEZhY3RvciA3CgpgYGB7cn0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gNykKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE1fQpwbG90X2RhdGFfaGVhdG1hcChteWVsb2lkX21vZmFfdHJhaW5lZCwgdmlldz0iVEgiLCBmYWN0b3IgPSA3LCBhbm5vdGF0aW9uX3NhbXBsZXMgPSAiZ3JvdXAiKQpncyA8LSBnZXRfdmlld19nZW5lcyhteWVsb2lkX21vZmFfdHJhaW5lZCwgdmlldz0iVEgiLCBmYWN0b3I9NykKcGxvdF92aWV3X2dlbmVzKGdzKQpgYGAKCgojIyBGYWN0b3IgOAoKYGBge3J9CnBsb3RfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB5ID0gImdyb3VwIiwgZmFjdG9ycyA9IDgpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xOH0KcGxvdF9kYXRhX2hlYXRtYXAobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IkJNIiwgZmFjdG9yID0gOCwgYW5ub3RhdGlvbl9zYW1wbGVzID0gImdyb3VwIikKcGxvdF9kYXRhX2hlYXRtYXAobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IkxJIiwgZmFjdG9yID0gOCwgYW5ub3RhdGlvbl9zYW1wbGVzID0gImdyb3VwIikKcGxvdF9kYXRhX2hlYXRtYXAobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IlNLIiwgZmFjdG9yID0gOCwgYW5ub3RhdGlvbl9zYW1wbGVzID0gImdyb3VwIikKZ3MgPC0gZ2V0X3ZpZXdfZ2VuZXMobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IkJNIiwgZmFjdG9yID0gOCkKcGxvdF92aWV3X2dlbmVzKGdzKQpgYGAKYGBge3J9CiMgc2FwcGx5KGdldF93ZWlnaHRzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCAgZmFjdG9ycyA9IDgsIGFzLmRhdGEuZnJhbWUgPSBGQUxTRSksIGZ1bmN0aW9uKHYpIHZbLDFdKSAKYGBgCgojIyBGYWN0b3IgOQoKYGBge3J9CnBsb3RfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB5ID0gImdyb3VwIiwgZmFjdG9ycyA9IDkpCmBgYApgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTN9CnBsb3RfZmFjdG9yKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gOSwgZ3JvdXBfYnkgPSAgInRpbWUiLCBjb2xvcl9ieSA9ICJncm91cCIsICBhZGRfYm94cGxvdCA9IFRSVUUsIGRvZGdlID0gVFJVRSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CnBsb3RfZGF0YV9oZWF0bWFwKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJCTSIsIGZhY3RvciA9IDksIGFubm90YXRpb25fc2FtcGxlcyA9ICJncm91cCIpCnBsb3RfZGF0YV9oZWF0bWFwKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJTUCIsIGZhY3RvciA9IDksIGFubm90YXRpb25fc2FtcGxlcyA9ICJncm91cCIpCnBsb3RfZGF0YV9oZWF0bWFwKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJTSyIsIGZhY3RvciA9IDksIGFubm90YXRpb25fc2FtcGxlcyA9ICJncm91cCIpCmdzIDwtIGdldF92aWV3X2dlbmVzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJCTSIsIGZhY3RvciA9IDkpCnBsb3Rfdmlld19nZW5lcyhncywgZmlsdGVyX2Fubm8gPSBjKCJwcm9tb25vY3l0ZSIsICJQcm9teWVsb2N5dGUiLCAiREMzIiwgIkdNUCIpKQpgYGAKCiMjIEZhY3RvciAxMQoKYGBge3J9CnBsb3RfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB5ID0gImdyb3VwIiwgZmFjdG9ycyA9IDExKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0zfQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IDExLCBncm91cF9ieSA9ICAidGltZSIsIGNvbG9yX2J5ID0gImdyb3VwIikKYGBgCiMjIEZhY3RvciAxMgoKYGBge3J9CnBsb3RfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB5ID0gImdyb3VwIiwgZmFjdG9ycyA9IDEyKQpgYGAKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0zfQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IDEyLCBjb2xvcl9ieSA9ICJncm91cCIpCmBgYApgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTE4fQpwbG90X2RhdGFfaGVhdG1hcChteWVsb2lkX21vZmFfdHJhaW5lZCwgdmlldz0iU0siLCBmYWN0b3IgPSAxMiwgYW5ub3RhdGlvbl9zYW1wbGVzID0gImdyb3VwIikKZ3MgPC0gZ2V0X3ZpZXdfZ2VuZXMobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IlNLIiwgZmFjdG9yID0gMTIpCnBsb3Rfdmlld19nZW5lcyhncykKYGBgCmBgYHtyfQpwbG90X3RvcF93ZWlnaHRzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJTSyIsIGZhY3RvciA9IDEyKQpwbG90X2RhdGFfc2NhdHRlcihteWVsb2lkX21vZmFfdHJhaW5lZCwgCiAgdmlldyA9ICJTSyIsIAogIGZhY3RvciA9IDEyLCAKICBmZWF0dXJlcyA9IDEwLCAgICAgICAgICMgTnVtYmVyIG9mIGZlYXR1cmVzIHRvIHNob3cKICBzaWduID0gInBvc2l0aXZlIiwgICAgICMgc2VsZWN0IHRvcCA2IGZlYXR1cmVzIHdpdGggcG9zaXRpdmUgd2VpZ2h0cwogIGNvbG9yX2J5ID0gImdyb3VwIiwgICMgY29sb3IgY2VsbHMgYnkgbGluZWFnZQogIGFkZF9sbSA9IFQsICAgICAgICAgICMgYWRkIGxpbmVhciByZWdyZXNzaW9uIGVzdGltYXRlcwogIGxtX3Blcl9ncm91cCA9IEYsIAogIGRvdF9zaXplID0gMgopCmBgYAoKIyMgRmFjdG9yIDEzCgpgYGB7cn0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gMTMpCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0zfQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IDEzLCBjb2xvcl9ieSA9ICJncm91cCIpCmBgYAoKIyMgRmFjdG9yIDE0CgpgYGB7cn0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHkgPSAiZ3JvdXAiLCBmYWN0b3JzID0gMTQpCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0zfQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IDE0LCBjb2xvcl9ieSA9ICJncm91cCIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xOH0KcGxvdF9kYXRhX2hlYXRtYXAobXllbG9pZF9tb2ZhX3RyYWluZWQsIHZpZXc9IllTIiwgZmFjdG9yID0gMTQsIGFubm90YXRpb25fc2FtcGxlcyA9ICJncm91cCIpCmdzIDwtIGdldF92aWV3X2dlbmVzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCB2aWV3PSJZUyIsIGZhY3RvciA9IDE0KQpwbG90X3ZpZXdfZ2VuZXMoZ3MpCmBgYAoKIyMgTWFrZSBzaWduYXR1cmVzIGZyb20gbGF0ZW50IGZhY3RvcnMKCmBgYHtyfQpnZXRfd2VpZ2h0cygpCmBgYAoKIyBNb2RlbCAyIC0gTm9ybWFsIE1PRkEgLyBvbmx5IGNlbGx0eXBlcyBhcyBncm91cHMKCk1ha2UgTU9GQSBvYmplY3QuIFVzZQotIENlbGx0eXBlcyBhcyBncm91cHMKCmBgYHtyfQpteWVsb2lkX21vZmEgPC0gY3JlYXRlX21vZmFfZnJvbV9TaW5nbGVDZWxsRXhwZXJpbWVudChteWVsb2lkX3NjZSwgYXNzYXkgPSAic2NhbGVkX2xvZ2NvdW50cyIsIGdyb3VwcyA9ICJhbm5vX2x2bF8yIikKbXllbG9pZF9tb2ZhCmBgYAoKUHJlcGFyZSA0IHRyYWluaW5nCgpgYGB7cn0KZGF0YV9vcHRzIDwtIGdldF9kZWZhdWx0X2RhdGFfb3B0aW9ucyhteWVsb2lkX21vZmEpCmRhdGFfb3B0cyRjZW50ZXJfZ3JvdXBzIDwtIEZBTFNFCgptb2RlbF9vcHRzIDwtIGdldF9kZWZhdWx0X21vZGVsX29wdGlvbnMobXllbG9pZF9tb2ZhKQptb2RlbF9vcHRzJG51bV9mYWN0b3JzIDwtIDIwCgp0cmFpbl9vcHRzIDwtIGdldF9kZWZhdWx0X3RyYWluaW5nX29wdGlvbnMobXllbG9pZF9tb2ZhKQp0cmFpbl9vcHRzJHNlZWQgPC0gMjAyMAp0cmFpbl9vcHRzJGNvbnZlcmdlbmNlX21vZGUgPC0gIm1lZGl1bSIgIyB1c2UgImZhc3QiIGZvciBmYXN0ZXIgdHJhaW5pbmcKdHJhaW5fb3B0cyRzdG9jaGFzdGljIDwtIEZBTFNFCgptZWZpc3RvX29wdHMgPC0gZ2V0X2RlZmF1bHRfbWVmaXN0b19vcHRpb25zKG15ZWxvaWRfbW9mYSkKbWVmaXN0b19vcHRzJHdhcnBpbmcgPC0gRkFMU0UKIyBtZWZpc3RvX29wdHMkc3BhcnNlR1AgPC0gVFJVRQoKbXllbG9pZF9tb2ZhIDwtIHByZXBhcmVfbW9mYSgKICBvYmplY3QgPSBteWVsb2lkX21vZmEsCiAgZGF0YV9vcHRpb25zID0gZGF0YV9vcHRzLAogIG1vZGVsX29wdGlvbnMgPSBtb2RlbF9vcHRzLAogIHRyYWluaW5nX29wdGlvbnMgPSB0cmFpbl9vcHRzLAogIG1lZmlzdG9fb3B0aW9ucyA9IG1lZmlzdG9fb3B0cwopIApgYGAKCiMjIFRyYWluCgpgYGB7cn0Kb3V0ZmlsZSA8LSAiL25mcy90ZWFtMjA1L2VkNi9kYXRhL0ZldGFsX2ltbXVuZS9teWVsb2lkX21vZmFfbW9kZWxfb25ldmlldy5oZGY1IgpteWVsb2lkX21vZmFfdHJhaW5lZCA8LSBydW5fbW9mYShteWVsb2lkX21vZmEsIG91dGZpbGUgPSBvdXRmaWxlKQpgYGAKCmBgYHtyfQpteWVsb2lkX21vZmFfdHJhaW5lZCA8LSBsb2FkX21vZGVsKG91dGZpbGUpCmBgYApBZGQgc29tZSBjb3ZhcmlhdGVzCgpgYGB7cn0KCnNhbXBsZXNfbWV0YWRhdGEobXllbG9pZF9tb2ZhX3RyYWluZWQpICA8LSBzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYV90cmFpbmVkKSAlPiUKICBtdXRhdGUodGltZT1teWVsb2lkX3NjZVssbWF0Y2goc2FtcGxlc19tZXRhZGF0YShteWVsb2lkX21vZmFfdHJhaW5lZCkkc2FtcGxlLCBjb2xuYW1lcyhteWVsb2lkX3NjZSkpXSRhZ2UsCiAgICAgICAgIG1ldGhvZD1teWVsb2lkX3NjZVssbWF0Y2goc2FtcGxlc19tZXRhZGF0YShteWVsb2lkX21vZmFfdHJhaW5lZCkkc2FtcGxlLCBjb2xuYW1lcyhteWVsb2lkX3NjZSkpXSRtZXRob2QsCiAgICAgICAgIGRvbm9yPW15ZWxvaWRfc2NlWyxtYXRjaChzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYV90cmFpbmVkKSRzYW1wbGUsIGNvbG5hbWVzKG15ZWxvaWRfc2NlKSldJGRvbm9yLAogICAgICAgICBvcmdhbj1teWVsb2lkX3NjZVssbWF0Y2goc2FtcGxlc19tZXRhZGF0YShteWVsb2lkX21vZmFfdHJhaW5lZCkkc2FtcGxlLCBjb2xuYW1lcyhteWVsb2lkX3NjZSkpXSRvcmdhbikKYGBgCgpgYGB7cn0KcGxvdF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIHg9J2ZhY3RvcicsIHk9J2dyb3VwJywgc3BsaXRfYnkgPSAndmlldycsIHBsb3RfdG90YWwgPSBUUlVFKVtbMV1dICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpCgpnZXRfdmFyaWFuY2VfZXhwbGFpbmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBhcy5kYXRhLmZyYW1lID0gVFJVRSlbWzJdXSAlPiUKICBnZ3Bsb3QoYWVzKGdyb3VwLCB2YWx1ZSkpICsKICBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKwogIHlsYWIoIlZhci4gKCUpIikgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplPTE0KQpgYGAKClBsb3QgYnkgY2VsbHR5cGUKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KZ2V0X3ZhcmlhbmNlX2V4cGxhaW5lZChteWVsb2lkX21vZmFfdHJhaW5lZCwgYXMuZGF0YS5mcmFtZSA9IFRSVUUpW1sxXV0gJT4lCiAgZ2dwbG90KGFlcyhmYWN0b3IsIHZhbHVlKSkgKyBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAoZ3JvdXB+LiwgbmNvbCA9IDYsIHNjYWxlcyA9ICJmcmVlX3giKQpgYGAKYGBge3J9CmdldF92YXJpYW5jZV9leHBsYWluZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIGFzLmRhdGEuZnJhbWUgPSBUUlVFLCB2aWV3cyA9ICJzY2FsZWRfbG9nY291bnRzIilbWzFdXSAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzPWMoZ3JvdXApLCBuYW1lc19mcm9tPWZhY3RvciwgdmFsdWVzX2Zyb209dmFsdWUpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZ3JvdXAiKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICB0KCkgJT4lCiAgY29yKCkgJT4lCiAgcGhlYXRtYXA6OnBoZWF0bWFwKCkKYGBgCgoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD00fQpmb3IgKGYgaW4gY29sbmFtZXMobXllbG9pZF9tb2ZhX3RyYWluZWRAZXhwZWN0YXRpb25zJFckc2NhbGVkX2xvZ2NvdW50cykpewogIHByaW50KHBsb3RfZmFjdG9yKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gZiwgZ3JvdXBfYnkgPSAiZ3JvdXAiLCBjb2xvcl9ieSA9ICJvcmdhbiIsIGRvdF9zaXplID0gMC44LCBhZGRfYm94cGxvdCA9IFRSVUUsIGRvZGdlID0gVFJVRSkpCn0KYGBgCgpJbnNpZ2h0cyBzbyBmYXI6CgoxLiBGYWN0b3IxOgoyLiBGYWN0b3IyOgozLiBGYWN0b3IzOiBNQVNUL0Jhc28vRW8gdnMgcmVzdAo0LiBGYWN0b3I0OiBEQzEgc2lnbmF0dXJlLCBUSCBzcGVjaWZpYwo1LiBGYWN0b3I1OiBNQVNUL0Jhc28vRW8sIGxvdyBpbiBCTQo2LiBGYWN0b3I2OiBwcm9nZW5pdG9ycyBzaWduYWwsIGNvcnJlbGF0ZWQgd2l0aCBhZ2UgKHByb2dlbml0b3IgbWF0dXJhdGlvbj8pCjcuIEZhY3Rvcjc6IGRpZmZlcmVuY2VzIHdpdGhpbiBFUllfTUFDLCBtb3JlIGV4cHJlc3Npb24gb2YgaGVtb2dsb2JpbiBnZW5lcyBpbiBsaXZlciBhbmQgYm9uZSBtYXJyb3cgdGhhbiBTSwo4LzkuIEZhY3RvcnMgOCBhbmQgOSBsb29rIHRlY2huaWNhbCAoaGVhdHNob2NrIHByb3RlaW5zKQoxMC4gQ0xQIHZzIEdNUCBzaWduYXR1cmUgKEJNIHZzIFNQIGFuZCBMSSkKMTQuIEZhY3RvciAxNDogR1Ugc3BlY2lmaWMgREMgYW5kIE1vbm8gc2lnbmF0dXJlCgoKYGBge3J9CnBsb3RfZmFjdG9yX29yZGVyZWQgPC0gZnVuY3Rpb24obXllbG9pZF9tb2ZhX3RyYWluZWQsIGYpewogIGdldF9mYWN0b3JzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gZiwgYXMuZGF0YS5mcmFtZSA9IFRSVUUpICU+JQogICAgbXV0YXRlKG9yZ2FuID0gc2FwcGx5KHN0cl9zcGxpdChzYW1wbGUsICItIiksIGZ1bmN0aW9uKHgpIHhbbGVuZ3RoKHgpLTNdKSkgJT4lCiAgICBncm91cF9ieShncm91cCkgJT4lCiAgICBtdXRhdGUoZ3JfbWVhbiA9IG1lZGlhbih2YWx1ZSkpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgYXJyYW5nZShncl9tZWFuKSAlPiUKICAgIG11dGF0ZShncm91cD1mYWN0b3IoZ3JvdXAsIGxldmVscz11bmlxdWUoZ3JvdXApKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKGdyb3VwLCB2YWx1ZSwgY29sb3I9Z3JvdXApKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICBnZW9tX2ppdHRlcigpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlPTIpICsKICAgIGNvb3JkX2ZsaXAoKQp9CgpwbG90X2ZhY3Rvcl9vcmRlcmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmPTEpCnBsb3RfZmFjdG9yX29yZGVyZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIGY9MikKcGxvdF9mYWN0b3Jfb3JkZXJlZChteWVsb2lkX21vZmFfdHJhaW5lZCwgZj0zKQpwbG90X2ZhY3Rvcl9vcmRlcmVkKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmPTcpCnBsb3RfZmFjdG9yX29yZGVyZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIGY9MTApCnBsb3RfZmFjdG9yX29yZGVyZWQobXllbG9pZF9tb2ZhX3RyYWluZWQsIGY9MTQpCmBgYApgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTV9CnBsb3RfZmFjdG9yKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gMTAsIGNvbG9yX2J5ID0gIm9yZ2FuIiwgZ3JvdXBfYnkgPSAiZ3JvdXAiLCBkb2RnZSA9IFRSVUUsIGRvdF9zaXplID0gMiwgYWRkX2JveHBsb3QgPSBUUlVFKQpwbG90X3dlaWdodHMobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSA0LCBuZmVhdHVyZXMgPSA1MCwgdGV4dF9zaXplID0gNikKcGxvdF93ZWlnaHRzX3NjYXR0ZXIobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSA5OjEwKQpgYGAKCgo8IS0tIGBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9NX0gLS0+CjwhLS0gZ2V0X2ZhY3RvcnMobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSAzLCBhcy5kYXRhLmZyYW1lID0gVFJVRSkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKG9yZ2FuID0gc2FwcGx5KHN0cl9zcGxpdChzYW1wbGUsICItIiksIGZ1bmN0aW9uKHgpIHhbbGVuZ3RoKHgpLTNdKSkgJT4lIC0tPgo8IS0tICAgZ3JvdXBfYnkoZ3JvdXApICU+JSAtLT4KPCEtLSAgIG11dGF0ZShncl9tZWFuID0gbWVkaWFuKHZhbHVlKSkgJT4lIC0tPgo8IS0tICAgdW5ncm91cCgpICU+JSAtLT4KPCEtLSAgIGFycmFuZ2UoZ3JfbWVhbikgJT4lIC0tPgo8IS0tICAgbXV0YXRlKGdyb3VwPWZhY3Rvcihncm91cCwgbGV2ZWxzPXVuaXF1ZShncm91cCkpKSAlPiUgLS0+CjwhLS0gICBnZ3Bsb3QoYWVzKG9yZ2FuLCB2YWx1ZSwgY29sb3I9b3JnYW4pKSArIC0tPgo8IS0tICAgZ2VvbV9ib3hwbG90KCkgKyAtLT4KPCEtLSAgIGdlb21faml0dGVyKCkgKyAtLT4KPCEtLSAgICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGU9MikgKyAtLT4KPCEtLSAgIGNvb3JkX2ZsaXAoKSArIC0tPgo8IS0tICAgZmFjZXRfd3JhcCgufmdyb3VwLCBzY2FsZXMgPSAiZnJlZV94IikgLS0+CjwhLS0gICAgICAgICAgICAgZ3JvdXBfYnkgPSAiZ3JvdXAiLCAgZG90X3NpemUgPSAwLjgsIGFkZF9ib3hwbG90ID0gVFJVRSwgZG9kZ2UgPSBUUlVFKSArIC0tPgo8IS0tICAgY29vcmRfZmxpcCgpIC0tPgo8IS0tIGBgYCAtLT4KCgojIyBHbyBieSBjZWxsdHlwZSBpbnN0ZWFkIG9mIGZhY3RvcgoKIyMjIERDMQpgYGB7cn0KZ2V0X3ZhcmlhbmNlX2V4cGxhaW5lZChteWVsb2lkX21vZmFfdHJhaW5lZCwgYXMuZGF0YS5mcmFtZSA9IFRSVUUpW1sxXV0gJT4lCiAgZmlsdGVyKGdyb3VwPT0iREMxIikgJT4lCiAgZ2dwbG90KGFlcyhmYWN0b3IsIHZhbHVlKSkgKyBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAoZ3JvdXB+LiwgbmNvbCA9IDYsIHNjYWxlcyA9ICJmcmVlX3giKQpgYGAKYGBge3J9CnBsb3RfZmFjdG9ycyhteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IGMoMiw0KSwgY29sb3JfYnkgPSAib3JnYW4iLCBncm91cHMgPSAiREMxIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnBsb3RfZmFjdG9yKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gYyg0KSwgY29sb3JfYnkgPSAib3JnYW4iLCBncm91cF9ieSA9ICJvcmdhbiIsIGdyb3VwcyA9ICJEQzEiKQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9ycyA9IDQsIGdyb3VwX2J5ID0gImdyb3VwIiwgY29sb3JfYnkgPSAib3JnYW4iLCBkb3Rfc2l6ZSA9IDAuOCwgYWRkX2JveHBsb3QgPSBUUlVFLCBkb2RnZSA9IFRSVUUpCmBgYApgYGB7cn0KcGxvdF93ZWlnaHRzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gNCwgbmZlYXR1cmVzID0gMzApCmBgYApgYGB7cn0KcGxvdF9kYXRhX3NjYXR0ZXIobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvciA9IDQsIGdyb3Vwcz0iREMxIiwgY29sb3I9Im9yZ2FuIiwgZmVhdHVyZXM9IkhMQS1EUkEiKQpgYGAKCiMjIEV4cGxvcmUgYnkgZmFjdG9yCmBgYHtyfQpwbG90X2ZhY3RvcihteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9yID0gMykKcGxvdF93ZWlnaHRzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3IgPSAzLCBuZmVhdHVyZXMgPSAyMCkKYGBgCgoKIyMgRmluZCBmYWN0b3JzIHRoYXQgZGlzY3JpbWluYXRlIGJldHdlZW4gb3JnYW5zCgoKYGBge3J9CmdldF9vcmdhbl9BVUMgPC0gZnVuY3Rpb24obXllbG9pZF9tb2ZhX3RyYWluZWQsIGYsIGdyKXsKICBmX2RmIDwtIGdldF9mYWN0b3JzKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmYWN0b3JzID0gZiwgZ3JvdXBzID0gZ3IsIGFzLmRhdGEuZnJhbWUgPSBUUlVFKSAlPiUKICAgICMgZ3JvdXBfYnkoZ3JvdXApICU+JQogICAgIyBtdXRhdGUodmFsdWU9c2NhbGUodmFsdWUpKSAlPiUKICAgICMgdW5ncm91cCgpICU+JQogICAgbXV0YXRlKG9yZ2FuID0gc2FwcGx5KHN0cl9zcGxpdChzYW1wbGUsICItIiksIGZ1bmN0aW9uKHgpIHhbbGVuZ3RoKHgpLTNdKSkgCiAgb3JnYW5zIDwtIHVuaXF1ZShmX2RmJG9yZ2FuKQogIHN1cHByZXNzV2FybmluZ3Moc3VwcHJlc3NNZXNzYWdlcyh7b3JnX2F1YyA8LSBzYXBwbHkob3JnYW5zLCBmdW5jdGlvbihvcmcpIHJvYyhhcy5udW1lcmljKGZfZGYkb3JnYW49PW9yZyksIGZfZGYkdmFsdWUpJGF1Yyl9KSkKICBhbGxfb3JnYW5zIDwtIGFzLmNoYXJhY3Rlcih1bmlxdWUobXllbG9pZF9tb2ZhX3RyYWluZWRAc2FtcGxlc19tZXRhZGF0YSRvcmdhbikpCiAgb3JnX2F1YyA8LSBzZXROYW1lcyhvcmdfYXVjW2FsbF9vcmdhbnNdLCBhbGxfb3JnYW5zKQogIHJldHVybihvcmdfYXVjKQp9CgphbGxfb3JnYW5zIDwtIGFzLmNoYXJhY3Rlcih1bmlxdWUobXllbG9pZF9tb2ZhX3RyYWluZWRAc2FtcGxlc19tZXRhZGF0YSRvcmdhbikpCmFsbF9ncm91cHMgPC0gYXMuY2hhcmFjdGVyKHVuaXF1ZShteWVsb2lkX21vZmFfdHJhaW5lZEBzYW1wbGVzX21ldGFkYXRhJGdyb3VwKSkKCiMjIE1hc2sgaWYgdG9vIGxpdHRsZSBzYW1wbGVzCm5fc2FtcGxlc19tYXQgPC0gc2FtcGxlc19tZXRhZGF0YShteWVsb2lkX21vZmFfdHJhaW5lZCkgJT4lCiAgZ3JvdXBfYnkob3JnYW4sIGdyb3VwKSAlPiUKICBzdW1tYXJpc2Uobl9zYW1wbGVzPW4oKSkgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scz1jKGdyb3VwKSwgbmFtZXNfZnJvbT0ib3JnYW4iLCB2YWx1ZXNfZnJvbT0ibl9zYW1wbGVzIiwgdmFsdWVzX2ZpbGw9MCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJncm91cCIpICU+JQogIGFzLm1hdHJpeCgpCgptYXNrX3BhaXJzIDwtIHQobl9zYW1wbGVzX21hdCA8IDMpCgpBVUNfbWF0IDwtIHNhcHBseShhbGxfZ3JvdXBzLCBmdW5jdGlvbihnKSBnZXRfb3JnYW5fQVVDKG15ZWxvaWRfbW9mYV90cmFpbmVkLCBmPTEwLCBncj1nKSkKQVVDX21hdFttYXNrX3BhaXJzW3Jvd25hbWVzKEFVQ19tYXQpLCBjb2xuYW1lcyhBVUNfbWF0KV1dIDwtIE5BCgpBVUNfdGhyZXNoID0gMC44CnJlc2hhcGUyOjptZWx0KEFVQ19tYXQsIHZhcm5hbWVzPWMoIm9yZ2FuIiwgImdyb3VwIiksIHZhbHVlLm5hbWU9IkFVQyIpICU+JQogIGdncGxvdChhZXMob3JnYW4sIGdyb3VwKSkgKwogIGdlb21fcG9pbnQoYWVzKHNpemU9QVVDLCBjb2xvcj1BVUMpKSArCiAgZ2VvbV9wb2ludChkYXRhPS4gJT4lIGZpbHRlcihBVUMgPiBBVUNfdGhyZXNoKSwgc2hhcGU9OCwgc2l6ZT0yLGNvbG9yPSJ3aGl0ZSIpICsKICBzY2FsZV9zaXplKGxpbWl0cyA9IGMoMC41LDEpKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNSwgIlJlZHMiKSkKYGBgCgoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD00fQpsaWJyYXJ5KHBhdGNod29yaykKcGxvdF9mYWN0b3IobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSA1LCBncm91cF9ieSA9ICJncm91cCIsIGNvbG9yX2J5ID0gIm9yZ2FuIiwgZG9kZ2UgPSBUUlVFLCBhZGRfYm94cGxvdCA9IFRSVUUpIAoKICBwbG90X2xheW91dChndWlkZXM9ImNvbGxlY3QiKQoKYGBgCmBgYHtyfQpwbG90X3dlaWdodHMobXllbG9pZF9tb2ZhX3RyYWluZWQsIGZhY3RvcnMgPSA1LCBuZmVhdHVyZXMgPSAzMCkKYGBgCmBgYHtyfQpwbG90X2RhdGFfaGVhdG1hcChteWVsb2lkX21vZmFfdHJhaW5lZCwgZmFjdG9yID0gNSwgc2hvd19jb2xuYW1lcz1GQUxTRSkKYGBgCgoKCiMgTW9kZWwgMyAtICBNRUZJU1RPIAoKQWRkIHRpbWUgYXMgY292YXJpYXRlIHRvIHJ1biBNRUZJU1RPCgpgYGB7cn0KIyMgVmVjdG9yIGZvciB0aW1lIGFzc2lnbm1lbnQKdGltZXMgPC0gZGlzdGluY3QoZGF0YS5mcmFtZShhZ2U9bXllbG9pZF9zY2UkYWdlLCBuZXdfc2FtcGxlKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCduZXdfc2FtcGxlJykgJT4lCiAgLltzYW1wbGVfbmFtZXNfdW5pcXVlLF0KCnNhbXBsZXNfbWV0YWRhdGEobXllbG9pZF9tb2ZhKVtbInRpbWUiXV0gPC0gdGltZXMKCm15ZWxvaWRfbW9mYSA8LSBzZXRfY292YXJpYXRlcyhteWVsb2lkX21vZmEsIGNvdmFyaWF0ZXMgPSAidGltZSIpCm15ZWxvaWRfbW9mYQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0KZ2dfaW5wdXQgPC0gcGxvdF9kYXRhX292ZXJ2aWV3KG15ZWxvaWRfbW9mYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY292YXJpYXRlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfZGltZW5zaW9ucyA9IFRSVUUpIApnZ19pbnB1dApgYGAKCjwhLS0gS2VlcCBncm91cHMgdGhhdCBzcGFuIG11bHRpcGxlIHZpZXdzIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBncl9zYW1wbGVzIDwtIHNwbGl0KHNhbXBsZXNfbWV0YWRhdGEobXllbG9pZF9tb2ZhKSRzYW1wbGUsIHNhbXBsZXNfbWV0YWRhdGEobXllbG9pZF9tb2ZhKSRncm91cCkgLS0+CjwhLS0gYWxsKGlzLm5hKGRhdGEkQk1bLGdyX3NhbXBsZXMkQmFzb3BoaWxdKSkgLS0+CjwhLS0gbGFwcGx5KHVuaXF1ZShzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYSlbWyJncm91cCJdXSksIGZ1bmN0aW9uKHgpIGRhdGEkQk1bXSkgLS0+CgoKPCEtLSBteWVsb2lkX21vZmFAZGF0YSAtLT4KPCEtLSBzdWJzZShteWVsb2lkX21vZmEpWyxzYW1wbGVzX21ldGFkYXRhKG15ZWxvaWRfbW9mYSlbWyJncm91cCJdXSA9PSAiQmFzb3BoaWwiXSAtLT4KPCEtLSBgYGAgLS0+CgpQcmVwYXJlIDQgdHJhaW5pbmcKCmBgYHtyfQpkYXRhX29wdHMgPC0gZ2V0X2RlZmF1bHRfZGF0YV9vcHRpb25zKG15ZWxvaWRfbW9mYSkKCm1vZGVsX29wdHMgPC0gZ2V0X2RlZmF1bHRfbW9kZWxfb3B0aW9ucyhteWVsb2lkX21vZmEpCm1vZGVsX29wdHMkbnVtX2ZhY3RvcnMgPC0gMTAKCnRyYWluX29wdHMgPC0gZ2V0X2RlZmF1bHRfdHJhaW5pbmdfb3B0aW9ucyhteWVsb2lkX21vZmEpCnRyYWluX29wdHMkc2VlZCA8LSAyMDIwCnRyYWluX29wdHMkY29udmVyZ2VuY2VfbW9kZSA8LSAiZmFzdCIgIyB1c2UgImZhc3QiIGZvciBmYXN0ZXIgdHJhaW5pbmcKCm1lZmlzdG9fb3B0cyA8LSBnZXRfZGVmYXVsdF9tZWZpc3RvX29wdGlvbnMobXllbG9pZF9tb2ZhKQptZWZpc3RvX29wdHMkd2FycGluZyA8LSBGQUxTRQojIG1lZmlzdG9fb3B0cyRzcGFyc2VHUCA8LSBUUlVFCgpteWVsb2lkX21vZmEgPC0gcHJlcGFyZV9tb2ZhKAogIG9iamVjdCA9IG15ZWxvaWRfbW9mYSwKICBkYXRhX29wdGlvbnMgPSBkYXRhX29wdHMsCiAgbW9kZWxfb3B0aW9ucyA9IG1vZGVsX29wdHMsCiAgdHJhaW5pbmdfb3B0aW9ucyA9IHRyYWluX29wdHMsCiAgbWVmaXN0b19vcHRpb25zID0gbWVmaXN0b19vcHRzCikgCmBgYAoKIyMgVHJhaW4KCmBgYHtyfQpvdXRmaWxlIDwtICIvbmZzL3RlYW0yMDUvZWQ2L2RhdGEvRmV0YWxfaW1tdW5lL215ZWxvaWRfbWVmaXN0b19tb2RlbC5oZGY1IgpteWVsb2lkX21vZmFfdHJhaW5lZCA8LSBydW5fbW9mYShteWVsb2lkX21vZmEsIG91dGZpbGUgPSBvdXRmaWxlKQpgYGAKCiMjIExvYWQgdHJhaW5lZCBtb2RlbApgYGB7cn0KbXllbG9pZF9tb2ZhX3RyYWluZWQgPC0gbG9hZF9tb2RlbChvdXRmaWxlLCBsb2FkX2ludGVycG9sX1ogPSBUUlVFKQpgYGAKCg==